每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求。

1操作输入参数

控制器的操作的输入参数可以是内置类型也可以是自定义类型。

2操作返回结果

结果类型

调用方法

备注

ContentResult

Content

文本类型

FileContentResult/FileStreamResult/FilePathResult

File

文件类型

HttpStatusCodeResult(HttpNotFoundResult,HttpUnauthorizedResult)

HttpNotFound

包含404,401状态码

JavaScriptResult

JavaScript

JavaScript代码

JsonResult

Json

Json字符串

PartialViewResult

PartialView

部分视图

RedirectResult

Redirect/RedirectPermanent

跳转到给定URL

RedirectToRouteResult

RedirectToAction/RedirectToRoute

重定向到指定的路由

ViewResult

View

指定视图

EmptyResult

不返回任何内容

上述返回值类型均继承自ActionResult,除了上述类型外,控制器可以返回任意的类型!

3 HTTP动词特性

特性有HttpGet、HttpPost、HttpDelete、HttpPut、HttpHead、HttpOptions、HttpPatch,当没有限定任何动词时,不论何种请求,get,post,put等等,被请求的操作都会被调用。

4 操作过滤器

过滤器接口有

授权过滤器:public interface IAuthorizationFilter

动作过滤器:public interface IActionFilter

身份验证过滤器:public interface IAuthenticationFilter

异常过滤器:public interface IExceptionFilter

结果过滤器:public interface IResultFilter

1)AuthorizeAttribute

public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter

AuthorizeAttribute的两个常用属性

Roles:获取或设置有权访问控制器或操作方法的用户角色。

Users:获取或设置有权访问控制器或操作方法的用户。

可以在Web.config的<system.web>配置未通过验证跳转的页面:

<authentication mode="Forms">

<forms loginUrl="~/Account/Login"></forms>

</authentication>

配合其使用的属性

AllowAnonymous

public sealed class AllowAnonymousAttribute : Attribute

允许跳过AuthorizeAttribute的验证执行控制器操作。

2)ChildActionOnlyAttribute

public sealed class ChildActionOnlyAttribute : FilterAttribute, IAuthorizationFilter

指示操作方法只能作为子操作进行调用

例:

控制器

public class HomeController : Controller
{
[ChildActionOnly]
public ActionResult TestPy()
{
return PartialView();
}
}

分部视图TestPy.cshtml:

<div>
<h1>这是部分视图</h1>
</div>

调用页Index.cshtml:

<div class="row">
<a href="@Url.Action("Home", "TestPy")">点击调用分部视图</a>
</div>

执行报错:404!

将调用页代码修改如下:

<div class="row">
@Html.Action("TestPy")
</div>

运行可以正常显示部分视图内容

3)RequireHttpsAttribute

public class RequireHttpsAttribute : FilterAttribute, IAuthorizationFilter

强制通过 HTTPS 重新发送不安全的 HTTP 请求

4)ValidateInputAttribute

public class ValidateInputAttribute : FilterAttribute, IAuthorizationFilter

验证通过窗体传进来的信息

5)ValidateAntiForgeryTokenAttribute

public sealed class ValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter

阻止伪造请求

6)AsyncTimeoutAttribute

public class AsyncTimeoutAttribute : ActionFilterAttribute

设置异步操作超时时间

7)NoAsyncTimeoutAttribute

public sealed class NoAsyncTimeoutAttribute : AsyncTimeoutAttribute

设置异步操作永不超时

8)OutputCacheAttribute

public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter

将缓存其输出的操作方法

9)HandleErrorAttribute

public class HandleErrorAttribute : FilterAttribute, IExceptionFilter

处理由操作方法引发的异常

10)ActionNameAttribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]

public sealed class ActionNameAttribute : ActionNameSelectorAttribute

可以使用此特性改变操作的名称,使用新名称作为路由参数,方可路由到该操作

例:

[ActionName("AboutName")]
public ActionResult About()
{
......
}

11)NonActionAttribute

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]

public sealed class NonActionAttribute : ActionMethodSelectorAttribute

使用此特性修饰控制器操作,不会路由到此控制器方法

5向视图传递数据

与其说传递数据,倒不如说视图如何获得控制器处理过的数据。视图通过两种方式可以拿到数据:

1)通过控制器操作返回的结果(控制器返回结果是数据和视图的结合。

2)将结果赋给控制器属性并在View中使用这些属性。

public abstract class ControllerBase : IController

类中有三个属性ViewData、ViewBag、TempData,使用着三个属性向视图传递数据。

ViewData

它是字典类型

public ViewDataDictionary ViewData { get; set; }

public class ViewDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable

例:

第一种方式,弱类型

控制器

public ActionResult TestViewData()
{
ViewData["Field"] = "VD";
return View("Contact");
}

视图Contact.cshtml

@ViewData["Field"]

在Index.cshtml视图中调用

 @Html.Action("TestViewData")

第二种方式,弱型别,使用ViewData.Model

这种方式无法使用VS编译器的智能提示功能

控制器

public ActionResult TestViewData()
{
ViewData.Model = new ModelF { Field="VD"};
return View("Contact");
}

视图Contact.cshtml

@Model.Field

在Index.cshtml视图中调用

@Html.Action("TestViewData")

第三种方式,强型别,使用ViewData.Model

控制器与第二种方式基本相同,不同点就是视图Contact.cshtml

@model MVCPointApp.Models.ModelF
@Model.Field

ViewBag

它是动态类型,对ViewData的包装

public dynamic ViewBag { get; }

例:

控制器操作中ViewBag.Field

使用@ViewBag.Message

TempData

它也是字典类型

public TempDataDictionary TempData { get; set; }

public class TempDataDictionary : IDictionary<string, object>, ICollection<KeyValuePair<string, object>>, IEnumerable<KeyValuePair<string, object>>, IEnumerable

6 异步控制器

原理:

ASP.NET从线程池获得线程处理异步请求,异步调用完后,该线程回到线程池以便可以处理其他请求,同时通知ASP.NET重新抓取一个线程(不一定是处理异步请求的线程)来完成具体的异步操作(输出数据等)。

使用异步控制器的目的:

异步控制器操作中也要等待任务直至处理完,所以处理速度不比同步方法快,其主要作用是高效地利用服务器资源。

使用异步控制器的情形:

可能引发瓶颈的长操作,网络或I\O密集型操作,可取消长操作的情形。

构建异步控制器:

控制器继承AsyncController,控制器操作返回Task<ActionResult>,并用async 修饰。

public class AnysController : AsyncController
{
// GET: Anys
public async Task<ActionResult> Index()
{
//睡眠,模拟长任务
Thread.Sleep();
return View("Testpy");
}
}

7 扩展控制器

基类控制器

定义一个基类控制器,以便处理异常或无法找到请求对应的操作。

注意如果控制器使用HttpPost特性修饰,而客户端发起的是get请求,也会认为是无法找到操作。

例:

    public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
//错误日志记录
} protected override void HandleUnknownAction(string actionName)
{
//处理能找到此控制器,但找不到请求对应的操作
}
}

扩展授权过滤器(AuthorizeAttribute)

具体示例见:验证、授权与安全

动作过滤器(ActionFilterAttribute

ActionFilterAttribute是一个抽象类,有四个方法:

操作执行后被框架自动调用的方法:OnActionExecuted

操作执行前被框架自动调用的方法:OnActionExecuting

返回结果后被框架自动调用的方法:OnResultExecuted

返回结果前被框架自动调用的方法:OnResultExecuting

参考:

1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬

译。ASP.NET MVC4 Web编程

2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译  ASP.NET MVC4 高级编程(第四版)

3.黄保翕,ASP.NET MVC4开发指南

4.蒋金楠,ASP.NET MVC4框架揭秘

5.https://www.asp.net/mvc

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

ASP.NET MVC编程——控制器的更多相关文章

  1. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

  2. ASP.NET MVC 编程参考

    ASP.NET MVC 编程参考   转载请注明出处:http://surfsky.cnblogs.com MVC    参考 http://msdn.microsoft.com/zh-cn/dd40 ...

  3. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  4. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  5. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  6. [转]ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  7. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  8. 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  9. ASP.NET MVC编程——视图

    1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...

随机推荐

  1. 实用技巧:如何通过IP地址进行精准定位

    在甲方工作的朋友可能会遇到这样的问题,服务器或者系统经常被扫描,通过IP地址我们只能查到某一个市级城市,如下图: 当我们想具体到街道甚至门牌号,该怎么办??? 偶然间发现百度地图有高精度IP定位API ...

  2. <CEPH中国-深圳站-技术交流会演讲PPT> YY云平台Ceph Block应用实践 & 我写的书 《CEPH实战》

    YY云平台Ceph Block应用实践 http://s3.yyclouds.com/public/YY%E4%BA%91%E5%B9%B3%E5%8F%B0Ceph%E5%AE%9E%E8%B7%B ...

  3. 关于 target="_blank"漏洞的分析

    创建: 于 八月 30, 2016 关于 target="_blank"漏洞的分析  一.漏洞详情:首先攻击者能够将链接(指向攻击者自己控制的页面的,该被控页面的js脚本可以对母页 ...

  4. FFMpeg.H264解码win开发环境搭建

    开发环境: vc6.0 + sp5 + vcpp5,注意vcpp5在vc6+sp6上会安装失败. 源码: ff_264_dec_vc,可用vc进行编译调试,但编译环境限定如上. 声明:该工程是ffmp ...

  5. VxWorks镜像简介

    VxWorks镜像可分为三类:   可加载型VxWorks镜像:存储在开发机上,运行在板上RAM中   基于ROM的VxWorks镜像:存储在板上ROM,运行在板上RAM中   ROM驻留的VxWor ...

  6. zTree实现地市县三级级联封装类

    zTree实现地市县三级级联封装类 Province.java: /** * @Title:Province.java * @Package:com.gwtjs.model * @Descriptio ...

  7. MP4文件格式的解析

    MP4文件格式的解析,以及MP4文件的分割算法 mp4应该算是一种比较复杂的媒体格式了,起源于QuickTime.以前研究的时候就花了一番的功夫,尤其是如何把它完美的融入到视频点播应用中,更是费尽了心 ...

  8. SQLite笔记

    一.SQLite下载: http://www.sqlite.org/download.html (或在NuGet下载安装) 二.SQLite操作: 1.添加引用System.Data.SQLite,如 ...

  9. Centos运行Mysql因为内存不足进程被杀

    今天刚刚申请了一个新的域名,在申请完域名刚准备绑定给小伙伴分享注册新域名的喜悦时,刚把网站发到我们小伙伴们的讨论群里,却发现访问不了了,提示,数据库连接失败! 真的时一个尴尬.....    所有人都 ...

  10. GridView 翻页 索引超出范围

    事件回顾 今天GridView翻页时,又遇到错误:索引超出范围.必须为非负值并小于集合大小. 这是当时的PageIndexChanging和RowCommand两个事件的后台代码 protected ...