.NET MVC之ActionResult
ActionResult是所有Controler返回值的父类。各种结果都是由ActionResult包装后发往客户端的。
继承结构
- System.Web.Mvc.ContentResult
- System.Web.Mvc.EmptyResult
- System.Web.Mvc.FileResult
- System.Web.Mvc.HttpStatusCodeResult
- System.Web.Mvc.JavaScriptResult
- System.Web.Mvc.JsonResult
- System.Web.Mvc.RedirectResult
- System.Web.Mvc.RedirectToRouteResult
- System.Web.Mvc.ViewResultBase
从基层结构上来划分,基本上可以分为四类。视图类、文本类、文件类和状态码类。
视图类返回结果
先从我们最熟悉的视图类来说起。View()与PartialView()它们分别返回ViewResult和PartialViewResult。从我们第一次接触到.NET MVC开始就在用。作用就是将处理好的数据交给视图引擎(如果有的话),来渲染视图。
返回值 | 帮助方法 | 描述 |
渲染一个网页视图 | ||
渲染一个网页视图,但不使用布局页 |
一般我们为每个action创建的视图都是部分视图,里面只包含了一个网页中的一部分。View()在渲染完视图后会将结果嵌入在布局页中,返回网页的全部,而PartialView()在渲染完之后就直接将结果发送给了客户端。
文本类返回结果
返回值 | 帮助方法 | 描述 |
返回一段字符串文本,文本的内容格式用户可通过MIME指定 | ||
将数据序列化成JSON,之后返回给客户端 | ||
返回一段JavaScript格式的字符串 |
Content()
使用Content()方法和直接返回一个string字符串没什么区别,只不过你可以通过Content()指定一下返回内容的格式(XML或HTML等)与字符编码。
1. public string Content()
2. {
3. return "<h1>HelloKitty</h1>"; //浏览器显示 HelloKitty
4. }
5.
6. public ActionResult Content2()
7. {
8. //return Content("<h1>GoodbyeKitty</h1>"); //浏览器显示 GoodbyeKitty
9. //指定返回文本的格式与字符编码
10. return Content("<h1>GoodbyeKitty</h1>", "text/html",System.Text.Encoding.UTF8);
11. }
12.
13. //效果都是一样的
Json()
传入一个任意类型的对象,尽可能地将它格式化为JSON格式。我试过基本上任何类型的对象都可以进行格式化,只不过对于文件或图片这类东西格式化之后只是一大堆没用的乱码。
普遍来说,Dictionary这种键值对类型会被转换成js类,List这类会被转换成js数组。
1. class Student
2. {
3. public string Name { get; set; }
4. public int Age { get; set; }
5. }
6.
7. public ActionResult JSON1()
8. {
9. var array = new List<Student>();
10. array.Add(new Student { Name = "小明", Age = 12 });
11. array.Add(new Student { Name = "小李", Age = 15 });
12. return Json(array,JsonRequestBehavior.AllowGet); //JsonRequestBehavior用于指定是否允许GET方式访问,默认只允许POST
13.
14. //运行结果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
15. }
16.
17. public ActionResult JSON2()
18. {
19. //也可使用匿名内部类来保存数据
20. return Json(new { name = "test", age = 16, sex = "boy" }, JsonRequestBehavior.AllowGet);
21.
22. //运行结果:{"name":"test","age":16,"sex":"boy"}
23. }
JavaScript()
JavaScript()直接返回一个JavaScript代码字符串。JavaScript()的效果实际上和Content()是一样的,只不过JavaScript()会自动指定返回文本的内容是application/x-javascript。
1. public ActionResult JS()
2. {
3. return JavaScript("alert('" + DateTime.Now.ToLongTimeString() + "')");
4. }
5.
6. public ActionResult JS2()
7. {
8. return Content("alert('" + DateTime.Now.ToLongTimeString() + "')", "application/x-javascript");
9. //这样写效果和上面完全是一样的
10. }
11.
12. /*
13. <!DOCTYPE html>
14. <html lang="en">
15. <head>
16. <meta charset="UTF-8">
17. <script src="http://localhost:5695/home/js2"></script>
18. <!--可以直接在script标签中填写action的地址-->
19. </head>
20. <body></body>
21. </html>
22. */
文件类返回结果
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.
7. public ActionResult FILE2()
8. {
9. return File(@"test.png", @"image/png"); //通过文件名的方式
10. }
11.
12. public ActionResult FILE3()
13. {
14. System.Drawing.Bitmap b = new System.Drawing.Bitmap(100, 100); //创建一张空白图片
15. System.IO.MemoryStream ms = new System.IO.MemoryStream();
16. b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
17. byte[] bytes = ms.GetBuffer();
18.
19. return File(bytes, @"image/bmp"); //通过二进制数据的方式
20. }
21.
22. /*
23. //现在可以直接将地址赋值给img标签来进行显示了
24. <img src="http://localhost:5695/home/file1" alt="">
25. */
注意:返回的文件不要太大,否则会造成内存溢出。如果要下载大文件,最好就直接返回文件地址。
实现防盗链
如果只是简单的返回一个文件就太没有意思了。通过控制器来返回文件相对于直接将文件地址给用户而言,我们可以进行一些处理操作,比如只允许登陆过的用户查看此图片,或者在图片上添加水印。
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. }
实现验证码
通过动态生成一张图片返回给客户端。
状态码类返回结果
返回值 | 帮助方法 | 描述 |
返回一个HTTP 302状态码,使客户端浏览器跳转到指定的URL | ||
返回一个HTTP 302状态码,使客户端浏览器跳转到指定的action | ||
跳转到指定的URL,这取决于路由API | ||
(None) | 返回一个特定的HTTP 状态码与描述 | |
(None) | 返回一个HTTP 401状态码,提示用户未登录 | |
返回一个HTTP 404状态码,提示用户访问的资源不存在 | ||
(None) | 返回一个HTTP 200状态码表示请求成功,但不包含任何信息 |
如果action返回结果为null,Controler会自动将null替换为EmptyResult。
viewdata和viewbag的区别
mvc 后台返回 dt 前台取值
@代码块中写html 防止自动编码 需要用 @Html.Raw(sayHello)
代码块的用法:代码块中定了一个泛型的字符串。
@{ List<string> items = new List<string>();
items.Add("项目1");
items.Add("项目2");
items.Add("项目3");
}
在页面中输出泛型字符串的值:用到了文本代码和标记结合
@foreach (var item in items){
<li>@item</li>
}
输出结果如下,完美个完成了工作