ActionResult是一个抽象类,是Action运行后的回传类型,但是当Action回传ActionResult的时候,其实并不包含这个ActionResult的运行结果,而是包含运行这个ActionResult时所需的数据。

Asp.net  mvc定义了以下几种AcitonResult的派生类型,如下表。

类型 Controller辅助方法 用途帮助
ContentResult Content 回传一个用户自定义的文字属性
EmptyResult   不响应任何信息到客户端

FileResult

  • FileContentResult
  • FilePathResult
  • FileStreamResult
File

以二进制串流的方式回传一个文档信息:

  • 直接输出byte[]属性
  • 指定文档路径输出文档属性
  • 指定Stream对象回传其属性

HttpStatusCodeResult

  • HttpNotFoundResult
  • HttpUnauthorizedResult
 HttpNotFound

回传自定义的HTTP状态代码与消息:

  • 回传HTTP404状态代码
  • 回传HTTP401状态代码
 JavaScriptResult JavaScript   回传的是JavaScript脚本
 JsonResult  Json  将数据串行化成JSON格式回传
 RedirectResult

Redirect

RedirectPermanent

重新导向指定的URL 
 RedirectToRouteResult

RedirectToAction

RedirectToActionPermanent

RedirectToRoute

RedirectToRoutePermanent

 与RedirectResult类似,但是它重导向到一个Action或Route

ViewResultBase

  • ViewResult
  • PartialViewResut

View

PartialView

回传一个View页面

  • 回传检视页面(View Page)
  • 回传部分检视页面(Partial View)

如上表所示的“Controller辅助方式”都是在ASP.NET MVC的Controller基类里的辅助方法,这些辅助方法的主要目的是为了方便让你在Controller中回传ActionResult相关类型之用。如下程序代码可用来转址到另一个页面:

public ActionResult Index()
{
return new RedirectToRouteResult ( new RouteValueDictionary (
new{ action="About'}));
}

如果改用Controller辅助方法来撰写,就可以改成以下程序代码:

public ActionResult Index()
{
return RedirectToAction( "About");
}

      实际中,大多会使用Controller辅助方法来帮助从Controller中回传正确的ActionResult,不过了解这些ASP.NET MVC内建的ActionResult派生类型也是很重要的,也许在适当的时候可能会用上。下面就让我们来详细介绍这些ASP.NET MVC内建的ActionResult派生类型。

1.ViewResult

ViewResult是在ASP.NET MVC中最常用的ActionResult,用于回传一个标准的视图页面。通过Controller辅助方法能更方便地定义要如何输出视图页面,可以指定要输出的View名称、指定该View要套用哪几个母版页面(Layout Page)、指定要传入View的数据模型(Model)。

(1)回传默认的视图页面

public class HomeController:Controller
{
public ActionResult About()
{
return View();
}
}

运行/Views/Home/About.cshtml视图页面,并将结果输出至客户端。

(2)指定视图页面名称响应

如下演示会运行/Views/Home/About2.cshtml视图页面,并将结果输出至客户端。

public class HomeController:Controller
{
public ActionResult About()
{
return View("About2"); //About2是视图的名字
}
}

(3)指定的视图页面不存在

public class HomeController:Controller
{
public ActionResult About()
{
return View("AAA");
}
}

当在Views的对应目录下找不到视图时,就会出现如下图所示的异常消息。

在搜索目录时,ASP.NET MVC会到网站根目录下Views目录里先搜索第一层目录,默认将会先搜索与Controller同名的目录。如果找不到相对应的View页面,就会改为搜索Shared目录。

在views目录下的Shared目录中通常会放置共享于多个Controller之间的View页面,例如默认项目模板内就放置了模板页面(_Layout.cshtml)、共享的部分页面(_LoginPartial.cshtml)与错误显示页面(Error.cshtml)。

(4)指定视图和母版名称

public ActionResult Index()
{
return View("Index", "_Layout2");
}

      运行/Views/Home/Index.cshtml视图页面,并设置套用/Views/Shared/_Layout2.cshtml母版页面,并将结果输出至客户端。

(5)传入model强类型对象

public ActionResult Read ( int id )
{
Models.MvcGuestbookContext db=new MvcGuestbookContext();
var model=from p in db.Messages where p.Id==id select p;
return View(model);
}

运行/Views/Home/Read.cshtml视图页面,并传入model这个强类型对象,最后将结果输出至客户端。

2.PartialViewResult

PartialViewResult与ViewResult非常类似,但无法为选中的View指定母版页面。如果想在页面中设计出更好的关注点分离特性,可以将网页的其中一部分独立成另一个动作,这时就可以利用PartialViewResult取得页面中的部分属性。

除此之外,当网页前端开发以Ajax为主的网页应用时,也经常会利用PartialViewResult取得网页的部分属性,此时搭配PartialViewResult来取得部分属性也非常适合。

如下演示会运行/Views/Home/Index_Marquee.cshtml视图页面,并将结果输出至客户端,回传页面时并不会套用母版页面。

public ActionResult Index_Marquee()
{
return PartialView();
}

可参考例子默认Internet项目里面的layout母版中,登录部分视图等。

3.EmptyResult

有些action不需要回传任何数据,例如,我们想在网站实现联机人数的统计功能,可以从网页中动态发出一个HTTP请求给Controller的其中一个Action,当Controller收到要求后会在Action里运行加总或记录的动作,之后不回传任何数据,因为这个action的主要目的就是统计数据而已。

遇到这种情况,使用EmptyResult就非常合适,其使用方法如下:

public ActionResult OnlineUserHit()
{
return new EmptyResult();
}

或如下:

public ActionResult OnlineUserHit()
{
return;
}

4.ContentResult

ContentResult可以让你响应任意”文字属性“的结果,可以任意指定文字属性、属性类型(Content-Type)与文字编码(Encoding)。

(1)响应XML文字

 public class Default1Controller : Controller
{
public ActionResult GetXML()
{
return Content("<ROOT><TEXT>123</TEXT></ROOT>", "text/xml", System.Text.Encoding.UTF8);
}
}

响应一段XML文字,设置响应的Content-Type为text/html,并指定该文字的编码为Encoding.UTF8。

(2)响应UTF-8编码的HTML字符串

 public ActionResult GetXML()
{
string strHTML = "..."; //省略HTML的属性
return Content(strHTML);
}

如果只想单纯响应一串UTF-8编码的HTML字符串,使用第一个参数传入即可。

(3)直接回传字符串类型

public string Content()
{
string strHTML="...."; //省略HTML的属性
return strHTML;
}

在ASP.NET MVC中也有另一种表达如上例简单的回传类型,那就是直接将回传类型设置成string即可。

5.FileResult

FileResult可以响应任意文档的属性,包括二进制格式的数据,例如,图片、PDF、Excel文件或ZIP压缩文件等,可以传入byte[]、文档路径、Stream等不同的属性方式,让ASP.NET MVC帮你将属性回传给客户端。除此之外,还能指定回传时的属性类型(Content-Type)或指定客户端下载时要显示的文件名等。

事实上,FileResult是一个抽象类型,有三种类型分别如下:

  • FilePathResult:响应一个实体文档的属性
  • FileContentResult:回应一个byte[]属性
  • FileStreamResult:回应一个Stream属性

通过System.Web.Mvc.Controller类型中所提供的File辅助方法,可以不用记忆这么多,一个File辅助方法就能自动选定不同的FileResult响应。

(1)输出PNG图文件

在File方法中,第一个参数指定文件路径,第二个参数指定文件的 MIME 类型。

        public ActionResult GetFile()
{
return File(Server.MapPath("~/App_Data/UserA/avatar.png"), "image/png");
}

这样实现了通过Action输出一个放在App_Data目录下的PNG图片文件,该图片在浏览器中直接打开。

(2)将zip文件发送至浏览器

1
2
3
4
5
public ActionResult Download1()
{
    var path = Server.MapPath("~/Files/鹤冲天.zip");
    return File(path, "application/x-zip-compressed");
}

用户点击浏览器上的下载链接后,会调出下载窗口:


      大家应该注意到,文件名称会变成 Download1.zip,默认成了 Action 的名字。我们使用 File 方法的第二个重载来解决文件名的问题:

public ActionResult Download2()
{
var path = Server.MapPath("~/Files/鹤冲天.zip");
return File("g:\\鹤冲天.zip", "application/x-zip-compressed", "crane.zip");
}

我们可以通过给 fileDownloadName 参数传值来指定文件名,fileDownloadName 不必和磁盘上的文件名一样。下载提示窗口如下:

(3)将pdf文件发送至浏览器

public ActionResult GetFile()
{
byte[] fileContent=GetFileByteArrayFromDB();
return File(fileContent, "aaplication/pdf", "YourReport.pdf");
}

6.JavaScriptResult

JavaScriptResult的用途是响应JavaScript程序代码给浏览器,通过Ajax的程序开发,你可以利用JavaScriptResult来响应适当的JavaScript程序代码让浏览器动态运行。

其实JavaScriptResult的功能与ContentResult差不多,主要的差别在与默认的Content-Type不一样而已,JavaScriptResult默认的Content-Type为application/x-javascript。

如下演示即响应alert('ok')至客户端。

public ActionResult JavaScript()
{
return JavaScript("alert('ok')");
}

如果在View中,利用Ajax辅助方法撰写以下程序,就会动态调用JavaScript这个Action,并直接在浏览器中运行结果,过程中并不会换页:

@Ajax.ActionLink("Run JavaScript", "JavaScript", new AjaxOptions())

      请注意,如果你要在ASP.NET MVC 4默认网络项目母版中运行以上这段演示程序,记得要在母版页面(_Layout.cshtml)的<head>标签内装入正确的JavaScript函数库才能正常运行@Ajax.ActionLink辅助方法,代码段如下:

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval')

7.JsonResult

JSON(JavaScript Object Notation)是Web在实现Ajax应用程序时经常使用的一种传输数据格式,JsonResult可自动将任意对象数据串行化成JSON格式回传,JsonResult默认的ContentType为application/json。对某些JavaScript Framework这是必要需求,例如,jQuery。

JsonResult是使用JavaScriptSerializer完成JSON串行化操作,但如果你的对象无法串行化,这个转换的过程将会发生异常。

在使用JsonResult时必须特别注意,从ASP.NET MVC 2.0开始,为了避免JSON Hijacking的攻击,ASP.NET MVC开发团队基于安全性考虑,在默认的情况下,任何以JsonResult回传的要求都不允许HTTP GET取得任何JSON信息。

下面代码演示了在MVC的Ajax.ActionLink中如何使用JsonResult

Action

[HttpPost]
public ActionResult GetDetail()
{
return Json(new
{
UserName = "Test User Name",
Email = "Test@Test.com",
Desc = "Test Desc"
});
}

View

<script type="text/javascript">
function handleSuccess(context) {
$("#userName").html(context.UserName);
$("#email").html(context.Email);
$("#desc").html(context.Desc);
}
</script>
<table>
<tr>
<td>
UserName
</td>
<td>
<div id="userName" />
</td>
</tr>
<tr>
<td>
Email
</td>
<td>
<div id="email" />
</td>
</tr>
<tr>
<td>
Desc
</td>
<td>
<div id="desc" />
</td>
</tr>
</table>
@Ajax.ActionLink("Click Me", "GetDetail", new AjaxOptions { HttpMethod = "POST", OnSuccess = "handleSuccess" })

在点击ActionLink后,会调用GetDetailAction返回JsonResult,在OnSuccess方法中可以对返回的结果进行处理。

8.RedirectResult

ResirectResult的主要用途是运行重新导向到其他网址。以下演示就是使用RedirectResult将结果转至/Home/Index页面。

        public ActionResult Redirect()
{
return Redirect("/Home/Index");
}

试试看跳转到百度等外网地址。

9.RedirectToRoute

RedirectToRoute会替你运算所有现有的网址路由值(RouteValue),并比对网址路由表(RouteTable)中的每条规则。Controller类型中有四个与RedirectToRoute有关的辅助方法。

(1)RedirectToAction,让浏览器转向至该Action的网址

        public ActionResult RedirectToActionSample()
{
return RedirectToAction("SamplePage");
}
        public ActionResult RedirectToActionSample()
{
return RedirectToAction("List", "Member");
}
        public ActionResult RedirectToActionSample()
{
return RedirectToAction("List","Member",new{page=3})
}

(2)RedirectToActionPermanent

(3)RedirectToRoute

(4)RedirectToRoutePermanent

10.HttpStatusCodeResult

HttpStatusCodeResult的主要用途是让ASP.NET MVC回传特定的HTTP状态代码与消息给客户端。对于一些特殊的HTTP响应,可利用HttpStatusCodeResult帮助我们响应适当的状态代码。

        public ActionResult Create(FormCollection form)
{
//TODO:依据客户端窗体输入的数据在数据库中创建一条新记录
return new HttpStatusCodeResult(System.Net.HttpStatusCode.Created, "数据已被成功创建");
}

11.HttpNotFoundResult

HttpNotFoundResult专门用来响应HTTP404找不到网页的错误,在System.Web.Mvc.Controller类型中内建了一个HttpNotFound辅助方法,可以方便回传HttpNotFoundResult类型的ActionResult结果,程序演示如下。

        public ActionResult Get(int id)
{
var data = GetDataFromDB(id); if (data = null)
{
return HttpNotFound();
}
else
{
return View(data);
}
}

12.HttpUnauthorizedResult

HttpUnauthorizedResult专门用来响应HTTP 401拒绝访问的错误,例如,你可以在Action里做出一些额外的权限检查,如果查出客户端用户并没有特定数据的访问权限,即可利用HttpUnauthorizedResult响应“拒绝访问”的HTTP状态代码,程序演示如下。

public ActionResult Get(int id)
{
if(CheckPermission(User.Identity.Name)
{
var data=GetDataFromDB(id);
if(data==null)
{
return HttpNotFound();
}
else
{
return View(data);
}
}
else
{
return new
HttpUnauthorizedResult();
}
}

024-ActionResult解说的更多相关文章

  1. ActionResult,PartialViewResult,EmptyResult,ContentResult

    HttpGet  HttpPost  HttpDelete  HttpPut  HeepHead HttpOptions HttpPatch属性都是动作方法选定器的一份子,比如若在action上套用H ...

  2. 《高级Web应用程序设计》课程学习资料

    任务1:什么是ASP.NET MVC 1.1  ASP.NET MVC简介 1.2 认识ASP.NET MVC项目结构 1.3 ASP.NET MVC生命周期 任务2:初识ASP.NET MVC项目开 ...

  3. MVC-03 控制器(2)

    五.ActionResult解说 ActionResult的继承图: 类型 Controller辅助方法 用途帮助 ContentResult Content 回传一个用户自定义的文字属性 Empty ...

  4. Ch02 从零开始实例学习5

    演练:添加模型 原文链接:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model ...

  5. 详解ASP.NET MVC 控制器

    1   概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由  一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...

  6. MVC中Controller控制器相关技术

    第6章Controller相关技术 Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并 且负责协调Model与View之间的数椐传递,是ASP.NET MV ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC 控制器

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. 《高级Web应用程序设计》课件(20170911)

    第一阶段:千里之行,始于足下 第1章 ASP.NET MVC概述 第2章 音乐商店制作 第二阶段:欲穷千里目,更上一层楼 第3章 设计模型 3.1 数据模型概述 3.2 使用EF Code First ...

  9. 【开源】OSharp框架解说系列(2.2):EasyUI复杂布局及数据操作

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  10. 【开源】OSharp框架解说系列(2.1):EasyUI的后台界面搭建及极致重构

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

随机推荐

  1. 《将博客搬至CSDN》的文章,

    <将博客搬至CSDN>的文章,并将文章地址填写在上方的"搬家通知博文地址"中.)

  2. merge into的用法

    merge into 是英文的一个短语,意思是汇入,合并.顾名思义,merge into是合并了insert和update操作,其执行效率要高于分别单独执行insert和update语句. //创建表 ...

  3. 我的android学习经历20

    WebView的使用 WebView既可以和Intent一样实现界面跳转一样,让系统浏览器打开页面,也可以在应用程序中打开页面 注意用WebView时,需要注册网络服务 代码如下: package c ...

  4. 利用jdbc处理oracle大数据---大文件和二进制文件

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  5. GBrowse配置相关资料

    GBrowse配置相关资料(形状.颜色.配置.gff3) http://gmod.org/wiki/Glyphs_and_Glyph_Optionshttp://gmod.org/wiki/GBrow ...

  6. Django 分页2 (Pagination)

    分页是Web应用常用的手法,Django提供了一个分页器类Paginator(django.core.paginator.Paginator),可以很容易的实现分页的功能.该类有两个构造参数,一个是数 ...

  7. 屏幕 Dynpro

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. [C和指针]第二部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. CUBRID学习笔记 22 插入数据

    CREATE TABLE auto_tbl(id INT AUTO_INCREMENT, name VARCHAR); 自增长的列可以插入null, 同时一次可以插入多条记录.别的和其他的sql数据库 ...

  10. Simulating a Freight robot in Gazebo

    Installation Before installing the simulation environment, make sure your desktop is setup with a st ...