Loading

ActionResult解说

定义

MVCActionResultAction的返回结果。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

ViewResultASP.NET MVC中最常用的ActionResult,用于回传一个标准的View页面

  1. 回传默认页面About2
public Class HomeController : Controller
{
    public ActionResult About()
    {
    	return View();
    }
}
  1. 跳转到指定的页面
public Class HomeController : Controller
{
    public ActionResult About()
    {
    	return View("About2");
    }
}
  1. 指派的页面不存在你
public Class HomeController : Controller
{
    public ActionResult About()
    {
    	return View("AAA");
    }
}

当在View对应目录下找不到时,就会出现如下图所示的例外消息。

PartialViewResult

PartialviewResult 对应的方法PartialView,去执行某个视图(不套用母版),把视图结果返回。多用于嵌套在其他视图做展示。
我们来看一下普通的ViewPartialView的区别。

  • 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-Typetext/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-Typeapplication/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数据无法被浏览器缓存,如果你的信息敏感度不高想操作缓存的话,可能还需要让JsonResultHTTP 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有关的辅助方法

  • RedirectToAction
  • RedirectToActionPermanent
  • RedireToRoute
  • RedirectToRoutePermanent

RedirectToActionRedirectToActionPermanent是一个比较简易的版本,直接传入Action名称即可设置让让浏览器转向至该Action的网址,也可以传入新增的RouteValue值。

  • 转到同Controller的另一个Action
public ActionResult RedirectToActionSample()
{
    return RedirectToAction("SamplePage");            
}
  • 转到指定Controller的特定Action并采用Http 301永久转址
public ActionResult RedirectToActionSample()
{
    return RedirectToActionPermanent("List","Member");            
}
  • 转址到MemberControllerListAction,并且加上page这个RouteValue
public ActionResult RedirectToActionSample()
{
    return RedirectToAction("List","Member",new{PageRemoteAttribute=3});          
}
posted @ 2021-02-05 13:48  群哥V  阅读(523)  评论(0)    收藏  举报