asp.net mvc5 step by step(四)——关于Controller的ActionResult

ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的 是非ActionResult类型,控制器将会将结果转换为一个ContentResult类型。默认的ControllerActionInvoker 调用ActionResult.ExecuteResult方法生成应答结果。

一、ActionResult的派生关系图:

二、常见的几种ActionResult

1、ContentResult

返回简单的纯文本内容,可通过ContentType属性指定应答文档类型,通过ContentEncoding属性指定应答文档的字符编码。可通过 Controller类中的Content方法便捷地返回ContentResult对象。如果控制器方法返回非ActionResult对象,MVC将 简单地以返回对象的ToString()内容为基础产生一个ContentResult对象。

C# 代码   复制

public ContentResult RSSFeed()

{

    Story[] stories = GetAllStories(); // Fetch them from the database or wherever



    // Build the RSS feed document

    string encoding = Response.ContentEncoding.WebName;

    XDocument rss = new XDocument(new XDeclaration("1.0", encoding, "yes"),

        new XElement("rss", new XAttribute("version", "2.0"),

            new XElement("channel", new XElement("title", "Example RSS 2.0 feed"),

                from story in stories

                select new XElement("item",

                      new XElement("title", story.Title),

                      new XElement("description", story.Description),

                      new XElement("link", story.Url)

                   )

            )

        )

    );

     return Content(rss.ToString(), "application/rss+xml");

}

2、EmptyResult

返回一个空的结果。如果控制器方法返回一个null,MVC将其转换成EmptyResult对象。

3、RedirectResult

表示一个连接跳转,相当于ASP.NET中的Response.Redirect方法。对应的Controller方法为Redirect。

C# 代码   复制

public override void ExecuteResult(ControllerContext context) {

    if (context == null) {

        throw new ArgumentNullException("context");

    }

    if (context.IsChildAction) {

        throw new InvalidOperationException(MvcResources.RedirectAction_CannotRedirectInChildAction);

    }



    string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);

    context.Controller.TempData.Keep();

    context.HttpContext.Response.Redirect(destinationUrl, false /* endResponse */);

}

4、RedirectToRouteResult

同样表示一个调转,MVC会根据我们指定的路由名称或路由信息(RouteValueDictionary)来生成Url地址,然后调用Response.Redirect跳转。对应的Controller方法为RedirectToAction和RedirectToRoute。

5、ViewResult:

表示一个视图结果,它根据视图模板产生应答内容。对应Controller方法为View。

6、PartialViewResult:

表示一个部分视图结果,与ViewResult本质上一致,只是部分视图不支持母版,对应于ASP.NET,ViewResult相当于一个Page,而PartialViewResult则相当于一个UserControl。它对应的Controller方法为PartialView。

7、HttpUnauthorizedResult:

表示一个未经授权访问的错误。MVC会向客户端发送一个401的应答状态。如果在web.config中开启了表单验证(authentication mode="Forms"),则401状态会将Url转向指定的loginUrl链接。

8、JavaScriptResult:

本质上是一个文本内容,只是将Response.ContentType设置为 application/x-javascript,此结果应该和MicrosoftMvcAjax.js脚本配合使用,客户端接收到Ajax应答后,将判断Response.ContentType的值,如果是application/x-javascript,则直接eval执行返回的应答内容。此结果类型对应的Controller方法为JavaScript。

9、JsonResult:

表示一个JSON结果。MVC将Response.ContentType设置为application/json,并通过JavaScriptSerializer类将指定对象序列化为Json表示方式。需要注意,默认情况下,MVC不允许GET请求返回JSON结果,要解除此限制,在生成JsonResult对象时,将其JsonRequestBehavior属性设置为JsonRequestBehavior.AllowGet。此结果对应的Controller方法为Json。

C# 代码   复制

class CityData { public string city; public int temperature; }

public JsonResult WeatherData()

{

    var citiesArray = new[] {

        new CityData { city = "London", temperature = 68 },

        new CityData { city = "Hong Kong", temperature = 84 }

    };

    return Json(citiesArray);

}

10、FilePathResult、FileContentResult、FileStreamResult: 这三个类继承于FileResult,表示一个文件内容,三者的区别在于,FilePath通过路径传送文件到客户端,FileContent通过二进制数据的方式,而FileStream是通过Stream的方式来传送。Controller为这三个文件结果类型提供了一个名为File的重载方法。

FilePathResult:直接将一个文件发送给客户端

C# 代码   复制

public FilePathResult DownloadReport()

{

    string filename = @"c:\\files\\somefile。pdf";

    return File(filename, "application/pdf", "AnnualReport。pdf");

}

FileContentResult:返回byte字节给客户端比如图片

C# 代码   复制



public FileContentResult GetImage(int productId)

{

    var product = productsRepository.Products.First(x => x.ProductID == productId);

    return File(product.ImageData, product.ImageMimeType);

}

<img src="<%: Url.Action("GetImage", "Products",  new { Model.ProductID }) %>" />

FileStreamResult:返回流

C# 代码   复制

public FileStreamResult ProxyExampleDotCom()

{

    WebClient wc = new WebClient();

    Stream stream = wc.OpenRead(http://www.studyofnet.com/);

    return File(stream, "text/html");

}

三、Controller的Helper方法,可以返回对应的ActionResult
时间: 2024-11-03 22:16:40

asp.net mvc5 step by step(四)——关于Controller的ActionResult的相关文章

Asp.Net MVC5入门学习系列②

原文:Asp.Net MVC5入门学习系列② 添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用来便于我们的开发,要是对MVC概念还有点模糊的,可以去我以前写的第一话 Asp.Net MVC 3.0[Hello World!]里开始部分就对此做了阐述.假定所有跟我一起学的都了解MVC的这么一个概念,我们就开始下面的步骤了: 现在我们开始添加一个Controller,具体如下: 我们选择创建一个

ASP.NET MVC轻教程 Step By Step 9——分页

现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在RouteConfig.cs中已有一条默认路由,但不能满足匹配类似/Page1这样的URL.我们要添加一条新的路由规则. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource

学习ASP .NET MVC5官方教程总结(四)添加模型

学习ASP .NET MVC5官方教程总结(四)添加模型 在前面的几章中,我们学习了,MVC中"C"和"V"的创建方法和基本的使用方法,这一章我们来看一下"C"--模型的创建方法. 我们将添加一些管理电影数据库的类,这些类在ASP.NET MVC 应用程序中扮演"Model"的角色. 我们将使用.NET Framework平台上熟知的Entity Framework 数据访问技术来定义和使用这些模型.Entity Framew

e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调

上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServer数据库的访问” 下面讲一下,对于在写Node.js自动化测试脚本过程中,的编写回调问题, 大家可能会发现, Node.js对于高并发处理的性能非常不错, 即使是在使用单核的情况下, 那是因为它是基于事情,说白了就是callback, 回调. 这样的话,对于写代码的人来说, 回调的深度一深就会晕了

ASP.NET MVC5 PagedList分页

ASP.NET MVC是目前ASP.NET开发当中轻量级的Web开发解决方案,在ASP.NET MVC概述这篇译文当中,已经详细的介绍了ASP.NET MVC与Web Forms的区别以及各自的适用场景.由于ASP.NET MVC尤其适合网站的开发(Web Forms更适合业务系统的开发),目前成为很多网站开发者的首先框架. 这里举个典型的例子(表格的分页),以此熟悉一下ASP.NET MVC的开发.开发环境:Windows 8.1企业版+VS2013旗舰版+SQL Server 2014. 首

数据库设计 Step by Step (2)——数据库生命周期

引言:数据库设计 Step by Step (1)得到这么多朋友的关注着实出乎了我的意外.这也坚定了我把这一系列的博文写好的决心.近来工作上的事务比较繁重,加之我期望这个系列的文章能尽可能的系统.完整,需要花很多时间整理.思考数据库设计的各种资料,所以文章的更新速度可能会慢一些,也希望大家能够谅解. 系列的第二讲我们将站在高处俯瞰一下数据库的生命周期,了解数据库设计的整体流程 数据库生命周期 大家对软件生命周期较为熟悉,数据库也有其生命周期,如下图所示. 图(1)数据库生命周期 数据库的生命周期

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入.控制反转(DI,IOC,依赖注入).AOP切面编程”新兴名词 很多人并不知道特别是从事.NET开发的人,至少在当时 是这么样的,但是在今天它们却是非常流行的技术指标,很多大牛也承认,这是主流的开发模式,你们可以从招聘网的技术岗位看出. 我从事过MVC2.0到5.0的相关开发工作,见证了MVC的成熟演变过程,就像本框架一样,设计模式未曾改变,但是代码一直在重 构.我也坚

Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现

一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目. 二.新建带有插件的项目 参考: ASP.NET MVC5 插件化机制简单实现 项目结构如下图: 三.建立DomainServices类库 新建一个ITestService接口,代码如下: namespace DomainServices { public interface ITestServi

ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

转自:http://www.cnblogs.com/mzwhj/p/3592895.html 上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东西没有理由不支持. 附件的上传同样基于KindEditor实现,可以上传图片,flash,影音,文件等. 目录 ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一)