EF5+MVC4系列(8) ActionResult的返回值

我们在MVC的代码中,经常会看到这样的一个 代码

image

可能有人会有疑问,既然我定义的是ActionResult,为什么返回值会是View方法呢?

image

其实这个View方法的返回值的类型是ActionResult的子类ViewResult

 

我们查看MVC源码可以看到 ActionResult是个抽象类,  ActionResult 有多个派生类(子类),有的子类又有子类 (例如 ViewResultBase 就有  ViewResult子类 和  PartialViewResult 这2种子类)

每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等。我们来看一下ActionResult派生类关系图

image

最后的图如下

image

他们的功能和调用方法 如下

 

类名称 子类名称 说明 对应Controller中的方法名
ContentResult     Content
EmptyResult     Empty
JavaScriptResult     JavaScript
JsonResult   返回Json格式的数据 Json
RedirectResult   使用Response.Redirect重定向页面(返回302状态码直接跳转到其他页面) Redirect
HttpStatusCodeResult HttpNotFoundResult 返回一个404状态码(未找到) HttpNotFound
HttpUnauthorizedResult 返回一个401状态码(未授权状态) HttpUnauthorized
FileResult FileContentResult 通过 文件byte[] 写入Response 返回客户端 File
FilePathResult 通过 文件路径 写入Response 返回客户端
FileStreamResult 通过 Stream 写入Response 返回客户端
ViewResultBase PartialViewResult 调用父类ViewResultBase 的ExecuteResult方法. 
重写了父类的FindView方法. 
寻找用户控件.ascx文件 在MVC4中,寻找cshtml视图
PartialView
ViewResult

调用父类ViewResultBase 的ExecuteResult方法. 
重写了父类的FindView方法. 
寻找视图页面(aspx,cshtml或自定义视图)

Controller的View()方法默认封装ViewResult返回结果

View
RedirectToRouteResult   根据Route规则重定向页面 RedirectToRoute

 

public ActionResult Test()
        {
            //return Content("文字内容",);                     //ContentResult  如果是用重载 指定内容的 MIME类型,还可以输出js脚本
            //return Content("<ROOT><TEXT>123</TEXT></ROOT>","text/xml",Encoding.UTF8);
            //return new EmptyResult();                     //EmptyResult  注意需要new来使用. 这里也可以写成 return null
            //return JavaScript("alert('xx')");             //JavaScriptResult  这里要注意,前台要通过js或者是jquery来调用这个Action才有效果
            //return Redirect("http://www.baidu.com");        //RedirectResult   直接跳转到指定页面
            //return HttpNotFound("This Page Not Exist");     //HttpNotFoundResult   返回404   这里还可以自己输入英文文字,如果是汉字,好像乱码
            //return new  HttpUnauthorizedResult();           //HttpUnauthorizedResult 返回 HTTP 错误 401.0 - Unauthorized 未授权,注意,需要new
            //return File(Server.MapPath("~/images/logo.png"), "image/png");   //直接在浏览器中显示图片
            //return File(Server.MapPath("~/images/logo.png"), "image/png","aa.png");   //让浏览器下载图片(提示下载,而不是显示图片)
            //return RedirectToRoute(new { action = "list" });  //转到指定路由,这里我只设定了Action为list 
            //return RedirectToAction("Edit", "Home", new { id = 3 }); //转到指定action,可以设置 Action,Controller以及参数
            //return PartialView("PartialLogin");   //PartialViewResult  //部分视图 一般是前台用ajax来调用
            //return View();  //完整视图
            return Json(new{id = 1,name = "will",CreatedOn = DateTime.Now}, JsonRequestBehavior.AllowGet);  //返回序列化后的json,并且允许ajax使用get方法调用
        }

下载

image

 

image

image

 

返回json(已经序列化过了)

 

image

 

关于上面FileResult下载的3种方式,以及 返回JavaScriptResult和 JsonResult 可以看看下面的2篇文章


了解ASP.NET MVC几种ActionResult的本质:FileResult
了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

posted @ 2014-07-21 17:16  梨花驿路  阅读(1577)  评论(0编辑  收藏  举报