ASP.NET MVC之ActionResult

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

继承结构

System.Object
System.Web.Mvc.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()在渲染完之后就直接将结果发送给了客户端。

文本类返回结果

这里写图片描述

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.Add(new Student { Name = "小明", Age = 12 });
    array.Add(new Student { Name = "小李", Age = 15 });
    return Json(array,JsonRequestBehavior.AllowGet);    //JsonRequestBehavior用于指定是否允许GET方式访问,默认只允许POST
    //运行结果:[{"Name":"小明","Age":12},{"Name":"小李","Age":15}]
}
public ActionResult JSON2()
{
    //也可使用匿名内部类来保存数据
    return Json(new { name = "test", age = 16, 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.Drawing.Bitmap b = new System.Drawing.Bitmap(100, 100);  //创建一张空白图片
    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");
}
实现验证码

通过动态生成一张图片返回给客户端。具体步骤可以参考这篇博文

状态码类返回结果

这里写图片描述

转自:https://www.cnblogs.com/wujingtao/p/5468228.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值