吴劲韬

null

null

.NET MVC之ActionResult

.NET MVC之ActionResult

ActionResult是所有Controler返回值的父类。各种结果都是由ActionResult包装后发往客户端的。

继承结构

从基层结构上来划分,基本上可以分为四类。视图类文本类文件类状态码类

视图类返回结果

先从我们最熟悉的视图类来说起。View()PartialView()它们分别返回ViewResultPartialViewResult。从我们第一次接触到.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.Add(new Student { Name = "小明", Age = 12 });
  10. array.Add(new Student { Name = "小李", Age = 15 });
  11. return Json(array,JsonRequestBehavior.AllowGet); //JsonRequestBehavior用于指定是否允许GET方式访问,默认只允许POST
  12. //运行结果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
  13. }
  14. public ActionResult JSON2()
  15. {
  16. //也可使用匿名内部类来保存数据
  17. return Json(new { name = "test", age = 16, 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.Drawing.Bitmap b = new System.Drawing.Bitmap(100, 100); //创建一张空白图片
  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

posted @ 2016-05-07 13:38  吴劲韬  阅读(3419)  评论(2编辑  收藏