.NET MVC之ActionResult
.NET MVC之ActionResult
ActionResult是所有Controler返回值的父类。各种结果都是由ActionResult包装后发往客户端的。
继承结构
从基层结构上来划分,基本上可以分为四类。视图类、文本类、文件类和状态码类。
视图类返回结果
先从我们最熟悉的视图类来说起。View()与PartialView()它们分别返回ViewResult和PartialViewResult。从我们第一次接触到.NET MVC开始就在用。作用就是将处理好的数据交给视图引擎(如果有的话),来渲染视图。
| 返回值 | 帮助方法 | 描述 |
|---|---|---|
| ViewResult |
View |
渲染一个网页视图 |
| PartialViewResult |
PartialView |
渲染一个网页视图,但不使用布局页 |
一般我们为每个action创建的视图都是部分视图,里面只包含了一个网页中的一部分。View()在渲染完视图后会将结果嵌入在布局页中,返回网页的全部,而PartialView()在渲染完之后就直接将结果发送给了客户端。
文本类返回结果
| 返回值 | 帮助方法 | 描述 |
|---|---|---|
| ContentResult |
Content |
返回一段字符串文本,文本的内容格式用户可通过MIME指定 |
| JsonResult |
Json |
将数据序列化成JSON,之后返回给客户端 |
| JavaScriptResult |
JavaScript |
返回一段JavaScript格式的字符串 |
Content()
使用Content()方法和直接返回一个string字符串没什么区别,只不过你可以通过Content()指定一下返回内容的格式(XML或HTML等)与字符编码。
- public string Content()
- {
- return "<h1>HelloKitty</h1>"; //浏览器显示 HelloKitty
- }
- public ActionResult Content2()
- {
- //return Content("<h1>GoodbyeKitty</h1>"); //浏览器显示 GoodbyeKitty
- //指定返回文本的格式与字符编码
- return Content("<h1>GoodbyeKitty</h1>", "text/html",System.Text.Encoding.UTF8);
- }
- //效果都是一样的
Json()
传入一个任意类型的对象,尽可能地将它格式化为JSON格式。我试过基本上任何类型的对象都可以进行格式化,只不过对于文件或图片这类东西格式化之后只是一大堆没用的乱码。
普遍来说,Dictionary这种键值对类型会被转换成js类,List这类会被转换成js数组。
- class Student
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
- public ActionResult JSON1()
- {
- var array = new List<Student>();
- array });
- array });
- return Json(array,JsonRequestBehavior.AllowGet); //JsonRequestBehavior用于指定是否允许GET方式访问,默认只允许POST
- //运行结果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
- }
- public ActionResult JSON2()
- {
- //也可使用匿名内部类来保存数据
- , sex = "boy" }, JsonRequestBehavior.AllowGet);
- //运行结果:{"name":"test","age":16,"sex":"boy"}
- }
JavaScript()
JavaScript()直接返回一个JavaScript代码字符串。JavaScript()的效果实际上和Content()是一样的,只不过JavaScript()会自动指定返回文本的内容是application/x-javascript。
- public ActionResult JS()
- {
- return JavaScript("alert('" + DateTime.Now.ToLongTimeString() + "')");
- }
- public ActionResult JS2()
- {
- return Content("alert('" + DateTime.Now.ToLongTimeString() + "')", "application/x-javascript");
- //这样写效果和上面完全是一样的
- }
- /*
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <script src="http://localhost:5695/home/js2"></script>
- <!--可以直接在script标签中填写action的地址-->
- </head>
- <body></body>
- </html>
- */
文件类返回结果
Controler中可以用于返回文件的方法也就只有File()。File()可以通过多种形式来发送文件,可以通过文件名、二进制Byte[]、Stream流。发送时还需要通过MIME标明一下文件类型。
- public ActionResult FILE1()
- {
- System.IO.Stream fs = System.IO.File.OpenRead(@"test.png");
- return File(fs, @"image/png"); //通过流的方法
- }
- public ActionResult FILE2()
- {
- return File(@"test.png", @"image/png"); //通过文件名的方式
- }
- public ActionResult FILE3()
- {
- System); //创建一张空白图片
- System.IO.MemoryStream ms = new System.IO.MemoryStream();
- b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
- byte[] bytes = ms.GetBuffer();
- return File(bytes, @"image/bmp"); //通过二进制数据的方式
- }
- /*
- //现在可以直接将地址赋值给img标签来进行显示了
- <img src="http://localhost:5695/home/file1" alt="">
- */
注意:返回的文件不要太大,否则会造成内存溢出。如果要下载大文件,最好就直接返回文件地址。
实现防盗链
如果只是简单的返回一个文件就太没有意思了。通过控制器来返回文件相对于直接将文件地址给用户而言,我们可以进行一些处理操作,比如只允许登陆过的用户查看此图片,或者在图片上添加水印。
- public ActionResult FILE1()
- {
- if (HttpContext.User.Identity.IsAuthenticated)
- //如果用户登录了才显示图片
- return File(@"test.png", @"image/png");
- else
- //没有登录就显示一张防盗链图片
- return File(@"test.png", @"image/png");
- }
实现验证码
通过动态生成一张图片返回给客户端。具体步骤可以参考我这篇博文.NET MVC 验证码。
状态码类返回结果
| 返回值 | 帮助方法 | 描述 |
|---|---|---|
| RedirectResult |
Redirect |
返回一个HTTP 302状态码,使客户端浏览器跳转到指定的URL |
| RedirectToRouteResult |
RedirectToAction |
返回一个HTTP 302状态码,使客户端浏览器跳转到指定的action |
| RedirectToRouteResult |
RedirectToRoute |
跳转到指定的URL,这取决于路由API |
| HttpStatusCodeResult |
(None) |
返回一个特定的HTTP 状态码与描述 |
| HttpUnauthorizedResult |
(None) |
返回一个HTTP 401状态码,提示用户未登录 |
| HttpNotFoundResult |
HttpNotFound |
返回一个HTTP 404状态码,提示用户访问的资源不存在 |
| EmptyResult |
(None) |
返回一个HTTP 200状态码表示请求成功,但不包含任何信息 |
如果action返回结果为null,Controler会自动将null替换为EmptyResult。
.NET MVC之ActionResult的更多相关文章
- springboot中扩展ModelAndView实现net mvc的ActionResult效果
最近在写spring boot项目,写起来感觉有点繁琐,为了简化spring boot中的Controller开发,对ModelAndView进行简单的扩展,实现net mvc中ActionResul ...
- ASP.NET MVC自定义ActionResult实现文件压缩
有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个ActionResult,方便进行文件下载 using System; using System.Collections; usi ...
- C# MVC 自定义ActionResult实现EXCEL下载
前言 在WEB中,经常要使用到将数据转换成EXCEL,并进行下载.这里整理资料并封装了一个自定义ActionResult类,便于使用.如果文章对你有帮助,请点个赞. 话不多少,这里转换EXCEL使用的 ...
- ASP.NET MVC 拓展ActionResult实现Html To Pdf 导出
之前实现了html直接转换为word文档的功能,那么是否也同样可以直接转换为pdf文档呢,网上搜了下html to pdf 的开源插件有很多 如:wkhtmltopdf,pdfsharp,itexts ...
- [转载]深入理解ASP.NET MVC之ActionResult
Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, actionNam ...
- MVC之ActionResult
一.所有的Controller都继承自System.Web.Mvc.Controller 目前ASP.NET MVC3默认提供了多种ActionResult的实现,在System.Web.Mvc命名空 ...
- Asp.net MVC 之 ActionResult
Action运行完后,回传的值通过ActionResult 类别或者其衍生的类别操作.ActionResult是一个抽象类,因此,Asp.net MVC 本身就实作了许多不同类型的ActionResu ...
- asp.net mvc之ActionResult
Web服务器接收到一个客户端请求以后,会对请求予以相应,而这个响应是通过Response来控制的, 但是在asp.net mvc 里,这部分的工作是由ActionResult来完成的, ActionR ...
- ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别
如果确认你返回的是一个视图(view),你可以直接返回类型为ViewResult. 如果你并不是很清楚,或者你根本不想去理解这些东西,你可以直接返回ActionResult
随机推荐
- HDU-2487
Ugly Windows Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
https://www.zhihu.com/question/25912483?sort=created
- CentOS7.5安装配置conky(极简)
1.安装epel源 下载地址:http://dl.fedoraproject.org/pub/epel/ 找到epel-release-XXXXXXX.rpm文件,下载解压 rpm -ivh epel ...
- 在 Ubuntu 系统安装 Redi
在 Ubuntu 系统安装 Redi 可以使用以下命令: $sudo apt-get update $sudo apt-get install redis-server 启动 Redis $ redi ...
- Linux用户密码文件/etc/shadow相关
(1).密码文件 [root@xuexi ~]# head -3 /etc/shadow root:$6$kcgcu794R0VP3fDL$aYN8XUbtWvZ4QQtT2xVW.N2CgE3YLP ...
- BM算法--串匹配
BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快.时间复杂度O(m/n) C++描述(教师版) int BM(cha ...
- JZYZOJ 1382 光棍组织 状压dp
http://172.20.6.3/Problem_Show.asp?id=1382 水得过分了,本来以为要用lzx学长的写法写,抱着试试看的想法写了个特暴力的dp+dfs,过了,真是... ...
- 【贪心】【set】zoj3963 Heap Partition
贪心地从前往后扫,每到一个元素,就查看之前的元素中小于等于其的最大的元素是否存在,如果存在,就将它置为其父亲.如果一个结点已经是两个儿子的父亲了,就不能在set中存在了,就将他删除.如果然后将当前元素 ...
- 【概率论】hdu5985 Lucky Coins
kill(i,j)表示第i种硬币在第j轮或者之前就死光的概率,它等于(1-pi^j)^num(i) rev(i,j)表示第i种硬币在j轮后仍然存活的概率,它等于1-kill(i,j) 然后对每种硬币i ...
- 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所
每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: #incl ...