每一个请求都会经过控制器处理, 控制器中的每个方法被称为控制器操作, 它处理具体的请求
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 动词特性
特性有 HttpGetHttpPostHttpDeleteHttpPutHttpHeadHttpOptionsHttpPatch, 当没有限定任何动词时, 不论何种请求, 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
类中有三个属性 ViewDataViewBagTempData, 使用着三个属性向视图传递数据
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
- -----------------------------------------------------------------------------------------
来源: https://www.cnblogs.com/hdwgxz/p/8633661.html