ActionResult解说
定义
MVC中ActionResult是Action的返回结果。ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等。ActionResult是一个抽象类,它定义了唯一的ExecuteResult方法,参数为一个ControllerContext,下面为您介绍MVC中的ActionResult 的用法。
常见的几种ActionResult
| 型别 | Controller辅助方法 | 用途帮助 |
|---|---|---|
| ContentResult | Content | 回传一个用户自定义的文字属性 |
| EmptyResult | 不响应任何信息到客户端 | |
| FileContentResult | File | 直接输出byte[]属性 |
| FilePathResult | File | 指定文档路径输出文档属性 |
| FileStreamResult | File | 指定Stream对象回传其属性 |
| HttpStatusCodeResult | HttpNotFound | 回传自定义的HTTP状态码和消息 |
| HttpNotFoundResult | HttpNotFound | 回传HTTP 400 状态码 |
| HttpUnauthorizedResult | HttpNotFound | 回传Http 404 状态码 |
| JavaScriptResult | JavaScript | 回传的是JavaScript脚本 |
| JsonResult | Json | 返回JSON格式数据 |
| RedirectResult | Redirect、RedirectPermanent | 重新导向到指定的URL |
| RedirectToRouteResult | RedirectToAction、RedirecToActionPermanent、RedirecToRoute、RedirecToRoutePermanent | 与RedirectResult类似,但是它是重导向到一个Action或者Route |
| ViewResultBase | 回传一个View页面 | |
| ViewResult | View | 表示一个视图结果,它根据视图模板产生应答内容。对应得Controller方法为View。 |
| PartialViewResult | PartialView | 不包含模板的视图 |
ActionResult的简单应用
ViewResult
ViewResult是ASP.NET MVC中最常用的ActionResult,用于回传一个标准的View页面
- 回传默认页面
About2
public Class HomeController : Controller
{
public ActionResult About()
{
return View();
}
}
- 跳转到指定的页面
public Class HomeController : Controller
{
public ActionResult About()
{
return View("About2");
}
}
- 指派的页面不存在你
public Class HomeController : Controller
{
public ActionResult About()
{
return View("AAA");
}
}
当在View对应目录下找不到时,就会出现如下图所示的例外消息。

PartialViewResult
PartialviewResult 对应的方法PartialView,去执行某个视图(不套用母版),把视图结果返回。多用于嵌套在其他视图做展示。
我们来看一下普通的View和PartialView的区别。
- View
public Class HomeController : Controller
{
public ActionResult About()
{
return View();
}
}
@{
ViewBag.Title = "About";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>ViewResult</h2>

-
PartialView
public Class HomeController : Controller { public ActionResult About2() { return PartialView(); } }<!--View页面修改--> @{ ViewBag.Title = "About"; Layout = "~/Views/Shared/_Layout.cshtml"; } @Html.Action("About2")

上面的两个实例可以看出PartialView 返回的是不带模板的视图
EmptyResult
有些Action不需要回传任何数据,遇到这种情况使用EmptyResult就非常合适。
public ActionResult OnlineUserHit()
{
return new EmptyResult();
}
在ASP.NET MVC中也有另外一种表达EmptyResult的方式,可以将上述语法写成如下:
public void OnlineUserHit()
{
return;
}
ContentResult
ContentResult可以让你相应任意文字属性的结果,可以任意指定文字属性、属性类型Content-Type与文字编码Encoding.
如下演示将会相应一段XML文字,设置相应的Content-Type为text/xml,并指定改文字的编码为Endcoding.UTF8
public ActionResult GetXML()
{
return Content("<Root><Text>123</Text></Root>","text/xml",System.Text.Encoding.UTF8);
}
如果只想单纯响应一串UTF-8编码的HTML字符串,使用第一个参数就可以
public ActionResult GetHtml()
{
string strHtml="......"; // 省略HTML的属性
return Content(strHtml);
}
在ASP.NET MVC中还有一种简单的回传类型,直接将回传类别设置为string即可
public string GetHtml()
{
string strHtml="......"; // 省略HTML的属性
return strHtml;
}
FileResult
FileResult可以响应任意文档的属性,包括二进制的数据,例如:图片 、PDF、Excel文件或者ZIP压缩文件等,可以传入byte[]、文档路径、Stream等不同的属性方式,让ASP.NET MVC帮你将属性传给客户端。
- 例如想输出一个图片可以参考以下代码
<img src="/Home/DownloadFile" />
public class HomeController : Controller
{
[HttpGet]
public FileResult DownloadFile()
{
return File(Server.MapPath("/upLoads/ecef0f6a-8ab8-4a06-a720-f451a147eee8.jpg"),"image/jpg");
}
}
这样可以直接使用img标签展示图片
- 如果希望浏览器下载文件而不是在浏览器打开文件,可以传入第三个参数文档名称。比如下载服务器上的某个Excel文件,可以先取得一个
byte[]或Stream数据。并在File辅助方法的第二个参数指定正确的Content-Type,最后指定要下载的文件名即可。
<a href="/Home/DownloadFile">下载文件</a>
[HttpGet]
public FileResult DownloadFile()
{
var path = Server.MapPath("/upLoads/202012221427271833.xls");
FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read);
byte[] fileDatas = new byte[fs.Length];
fs.Read(fileDatas, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
return File(fileDatas, "application/ms-excel","要下载的文件名.xls");
}
JavaScriptResult
JavaScript的用途是相应JavaScript程序代码给浏览器,通过Ajax的程序开发,可以利用JavaScriptResult来相应适当的JavaScript程序代码让浏览器动态运行。
public ActionResult JavaScript()
{
return JavaScript("alert('OK')");
}
JsonResult
JSON(JavaScript Object Notation)是Web在Ajax应用程序时经常用的一种传输数据格式,JsonResult可自动将任意对象数据串行化成json格式回传,JsonResult默认的Content-Type为application/json,对某些JavaScript Framework这是必需的。
!> 在使用JsonResult时必须特别注意,从ASP.NET MVC 2.0开始,为了避免JSON HiJacking的攻击,ASP.NET MVC 开发团队基于安全性考虑,在默认情况下任何以JsonResult回传的要求都不允许HTTP GET取得任何JSON信息。
- 如下演示会响应一个
JSON格式的数据
[HttpPost]
public JsonResult DownloadFile()
{
return Json(new {
Id=1,
name="Tom",
CreateOn=DateTime.Now.ToString()
});
}
如果是HTTP POST方法取得该属性,将会得到如下结果:

如果直接在浏览器输入网址(即以HTTP Get取得属性)将会出现如下错误信息
养成安全的开发习惯非常重要,建议尽量避免使用HTTP GET取得JSON数据,可是只使用HTTP POST取得JSON数据无法被浏览器缓存,如果你的信息敏感度不高想操作缓存的话,可能还需要让JsonResult对HTTP GET要求进行响应,解决办法就是替JSON辅助方法再加上一个JsonRequestBehabior列举参数,这样就可以通过GET方法获取JSON属性了
[HttpGet]
public JsonResult DownloadFile()
{
return Json(new {
Id=1,
name="Tom",
CreateOn=DateTime.Now.ToString()
},JsonRequestBehavior.AllowGet);
}
获取数据如下图:

RedirectResult
RedirectResult的主要用途是运行重新 导向到其他页面。
public ActionResult Index()
{
return Redirect("/Home/Video");
}
RedirectToRoute
RediretToRoute的行为与RedirectResult类似,不过,它会替你运算所有的网址路由值RoutValue并比对网址路由RouteTable中的每条规则
Controller类别中有四个RedirectToResult有关的辅助方法
RedirectToActionRedirectToActionPermanentRedireToRouteRedirectToRoutePermanent
RedirectToAction与RedirectToActionPermanent是一个比较简易的版本,直接传入Action名称即可设置让让浏览器转向至该Action的网址,也可以传入新增的RouteValue值。
- 转到同
Controller的另一个Action
public ActionResult RedirectToActionSample()
{
return RedirectToAction("SamplePage");
}
- 转到指定
Controller的特定Action并采用Http 301永久转址
public ActionResult RedirectToActionSample()
{
return RedirectToActionPermanent("List","Member");
}
- 转址到
MemberController的ListAction,并且加上page这个RouteValue
public ActionResult RedirectToActionSample()
{
return RedirectToAction("List","Member",new{PageRemoteAttribute=3});
}

浙公网安备 33010602011771号