.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等)与字符编码。

  1. public string Content()
  2. {
  3. return "<h1>HelloKitty</h1>"; //浏览器显示 HelloKitty
  4. }
  5. public ActionResult Content2()
  6. {
  7. //return Content("<h1>GoodbyeKitty</h1>"); //浏览器显示 GoodbyeKitty
  8. //指定返回文本的格式与字符编码
  9. return Content("<h1>GoodbyeKitty</h1>", "text/html",System.Text.Encoding.UTF8);
  10. }
  11. //效果都是一样的

Json()

传入一个任意类型的对象,尽可能地将它格式化为JSON格式。我试过基本上任何类型的对象都可以进行格式化,只不过对于文件或图片这类东西格式化之后只是一大堆没用的乱码。

普遍来说,Dictionary这种键值对类型会被转换成js类,List这类会被转换成js数组。

  1. class Student
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }
  6. public ActionResult JSON1()
  7. {
  8. var array = new List<Student>();
  9. array });
  10. array });
  11. return Json(array,JsonRequestBehavior.AllowGet); //JsonRequestBehavior用于指定是否允许GET方式访问,默认只允许POST
  12. //运行结果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
  13. }
  14. public ActionResult JSON2()
  15. {
  16. //也可使用匿名内部类来保存数据
  17. , sex = "boy" }, JsonRequestBehavior.AllowGet);
  18. //运行结果:{"name":"test","age":16,"sex":"boy"}
  19. }

JavaScript()

JavaScript()直接返回一个JavaScript代码字符串。JavaScript()的效果实际上和Content()是一样的,只不过JavaScript()会自动指定返回文本的内容是application/x-javascript。

  1. public ActionResult JS()
  2. {
  3. return JavaScript("alert('" + DateTime.Now.ToLongTimeString() + "')");
  4. }
  5. public ActionResult JS2()
  6. {
  7. return Content("alert('" + DateTime.Now.ToLongTimeString() + "')", "application/x-javascript");
  8. //这样写效果和上面完全是一样的
  9. }
  10. /*
  11. <!DOCTYPE html>
  12. <html lang="en">
  13. <head>
  14. <meta charset="UTF-8">
  15. <script src="http://localhost:5695/home/js2"></script>
  16. <!--可以直接在script标签中填写action的地址-->
  17. </head>
  18. <body></body>
  19. </html>
  20. */

文件类返回结果

Controler中可以用于返回文件的方法也就只有File()。File()可以通过多种形式来发送文件,可以通过文件名、二进制Byte[]、Stream流。发送时还需要通过MIME标明一下文件类型。

  1. public ActionResult FILE1()
  2. {
  3. System.IO.Stream fs = System.IO.File.OpenRead(@"test.png");
  4. return File(fs, @"image/png"); //通过流的方法
  5. }
  6. public ActionResult FILE2()
  7. {
  8. return File(@"test.png", @"image/png"); //通过文件名的方式
  9. }
  10. public ActionResult FILE3()
  11. {
  12. System); //创建一张空白图片
  13. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  14. b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
  15. byte[] bytes = ms.GetBuffer();
  16. return File(bytes, @"image/bmp"); //通过二进制数据的方式
  17. }
  18. /*
  19. //现在可以直接将地址赋值给img标签来进行显示了
  20. <img src="http://localhost:5695/home/file1" alt="">
  21. */

注意:返回的文件不要太大,否则会造成内存溢出。如果要下载大文件,最好就直接返回文件地址。

实现防盗链

如果只是简单的返回一个文件就太没有意思了。通过控制器来返回文件相对于直接将文件地址给用户而言,我们可以进行一些处理操作,比如只允许登陆过的用户查看此图片,或者在图片上添加水印。

  1. public ActionResult FILE1()
  2. {
  3. if (HttpContext.User.Identity.IsAuthenticated)
  4. //如果用户登录了才显示图片
  5. return File(@"test.png", @"image/png");
  6. else
  7. //没有登录就显示一张防盗链图片
  8. return File(@"test.png", @"image/png");
  9. }

实现验证码

通过动态生成一张图片返回给客户端。具体步骤可以参考我这篇博文.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的更多相关文章

  1. springboot中扩展ModelAndView实现net mvc的ActionResult效果

    最近在写spring boot项目,写起来感觉有点繁琐,为了简化spring boot中的Controller开发,对ModelAndView进行简单的扩展,实现net mvc中ActionResul ...

  2. ASP.NET MVC自定义ActionResult实现文件压缩

    有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个ActionResult,方便进行文件下载 using System; using System.Collections; usi ...

  3. C# MVC 自定义ActionResult实现EXCEL下载

    前言 在WEB中,经常要使用到将数据转换成EXCEL,并进行下载.这里整理资料并封装了一个自定义ActionResult类,便于使用.如果文章对你有帮助,请点个赞. 话不多少,这里转换EXCEL使用的 ...

  4. ASP.NET MVC 拓展ActionResult实现Html To Pdf 导出

    之前实现了html直接转换为word文档的功能,那么是否也同样可以直接转换为pdf文档呢,网上搜了下html to pdf 的开源插件有很多 如:wkhtmltopdf,pdfsharp,itexts ...

  5. [转载]深入理解ASP.NET MVC之ActionResult

    Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, actionNam ...

  6. MVC之ActionResult

    一.所有的Controller都继承自System.Web.Mvc.Controller 目前ASP.NET MVC3默认提供了多种ActionResult的实现,在System.Web.Mvc命名空 ...

  7. Asp.net MVC 之 ActionResult

    Action运行完后,回传的值通过ActionResult 类别或者其衍生的类别操作.ActionResult是一个抽象类,因此,Asp.net MVC 本身就实作了许多不同类型的ActionResu ...

  8. asp.net mvc之ActionResult

    Web服务器接收到一个客户端请求以后,会对请求予以相应,而这个响应是通过Response来控制的, 但是在asp.net mvc 里,这部分的工作是由ActionResult来完成的, ActionR ...

  9. ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别

    如果确认你返回的是一个视图(view),你可以直接返回类型为ViewResult. 如果你并不是很清楚,或者你根本不想去理解这些东西,你可以直接返回ActionResult

随机推荐

  1. HDU-2487

    Ugly Windows Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  2. RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

    https://www.zhihu.com/question/25912483?sort=created

  3. CentOS7.5安装配置conky(极简)

    1.安装epel源 下载地址:http://dl.fedoraproject.org/pub/epel/ 找到epel-release-XXXXXXX.rpm文件,下载解压 rpm -ivh epel ...

  4. 在 Ubuntu 系统安装 Redi

    在 Ubuntu 系统安装 Redi 可以使用以下命令: $sudo apt-get update $sudo apt-get install redis-server 启动 Redis $ redi ...

  5. Linux用户密码文件/etc/shadow相关

    (1).密码文件 [root@xuexi ~]# head -3 /etc/shadow root:$6$kcgcu794R0VP3fDL$aYN8XUbtWvZ4QQtT2xVW.N2CgE3YLP ...

  6. BM算法--串匹配

    BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快.时间复杂度O(m/n) C++描述(教师版) int BM(cha ...

  7. JZYZOJ 1382 光棍组织 状压dp

    http://172.20.6.3/Problem_Show.asp?id=1382   水得过分了,本来以为要用lzx学长的写法写,抱着试试看的想法写了个特暴力的dp+dfs,过了,真是...   ...

  8. 【贪心】【set】zoj3963 Heap Partition

    贪心地从前往后扫,每到一个元素,就查看之前的元素中小于等于其的最大的元素是否存在,如果存在,就将它置为其父亲.如果一个结点已经是两个儿子的父亲了,就不能在set中存在了,就将他删除.如果然后将当前元素 ...

  9. 【概率论】hdu5985 Lucky Coins

    kill(i,j)表示第i种硬币在第j轮或者之前就死光的概率,它等于(1-pi^j)^num(i) rev(i,j)表示第i种硬币在j轮后仍然存活的概率,它等于1-kill(i,j) 然后对每种硬币i ...

  10. 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

    每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案:若为零,就把他放入另一个集合里. 如果是宠物,则同上. 各种平衡树都可过,我蛋疼地用了pb_ds. Code: #incl ...