zoukankan      html  css  js  c++  java
  • ASP.NET MVC编程——控制器

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

    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重新抓取一个线程(不一定是处理异步请求的线程)来完成具体的异步操作(输出数据等)。

    使用异步控制器的目的:

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

    使用异步控制器的情形:

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

    构建异步控制器:

    控制器继承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

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

    转载与引用请注明出处。

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

  • 相关阅读:
    The Node.js Event Loop, Timers, and process.nextTick()
    Main event loop
    Why should I avoid blocking the Event Loop and the Worker Pool?
    HTML Standard系列:Event loop、requestIdleCallback 和 requestAnimationFrame
    在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
    多线程 主线程
    mvvm
    跨库事务
    nginx 死循环
    nginx proxy pass redirects ignore port
  • 原文地址:https://www.cnblogs.com/hdwgxz/p/8633661.html
Copyright © 2011-2022 走看看