每个请求都会通过控制器处理,控制器中的每一个方法被称为控制器操做,它处理具体的请求。html
1操做输入参数web
控制器的操做的输入参数能够是内置类型也能够是自定义类型。编程
2操做返回结果缓存
结果类型安全 |
调用方法服务器 |
备注网络 |
ContentResultmvc |
Content框架 |
文本类型asp.net |
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(5000000); 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
-----------------------------------------------------------------------------------------
转载与引用请注明出处。
时间仓促,水平有限,若有不当之处,欢迎指正。