.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. win10更换登陆背景和关闭锁屏

    更换登陆背景图 用国外一个hacker写的工具,可在github上下载,或者下载我上传到百度网盘的备份.win10默认的登陆背景太难看了. 去掉锁屏图片 登陆界面其实本身就是一种锁屏,为什么还要单独搞 ...

  2. new、operator new、placement new

    首先我们区分下几个容易混淆的关键词: new.operator new.placement new new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和释放,而这两个都是不能被重载的 ...

  3. JMX monitor weblogic 总结

    https://blog.csdn.net/joy_91/article/details/42774839

  4. initerrlog: 无法打开错误日志文件 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log 解决办法

    initerrlog: 无法打开错误日志文件 'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log 1. 设置 ...

  5. 文本检查点web_reg_find和web_find两个函数的区别

    LR脚本实战:文本检查点web_reg_find和web_find两个函数的区别   web_reg_find是先注册(register)后查找的:使用时将它放在请求语句的前面. 而web_find是 ...

  6. centos 磁盘分区格式化与挂载

    1 查看系统里硬盘信息fdisk -l 2 磁盘分区fdisk /dev/sdc输入m显示帮助a:命令指定启动分区:d:命令删除一个存在的分区:l:命令显示分区ID号的列表:m:查看fdisk命令帮助 ...

  7. mongo connect BI 连接至Power BI

    第一步:安装mongodb服务 官网地址:https://www.mongodb.com/download-center?jmp=nav#community mongodb的安装请参考:http:// ...

  8. Codeforces 1099 C. Postcard-字符串处理(Codeforces Round #530 (Div. 2))

    C. Postcard time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  9. NestedScrollView

    参考文章: Android滑动到顶部悬停 NestedScrollView的使用 效果图: 实现步骤: 将需要悬浮的layout放到CollapsingToolbarLayout之外,AppBarLa ...

  10. jQuery筛选

    1.filter筛选出与指定表达式匹配的元素集合 html: <p>Hello</p><p>Hello Again</p><p class=&qu ...