1. 程式人生 > >ASP.NET MVC程式設計——控制器

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等等,被請求的操作都會被呼叫。

操作過濾器

過濾器介面有

授權過濾器: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

http://www.myb6827.cn/
http://www.tcr0461.cn/
http://www.xua4102.cn/
http://www.tzn6024.cn/
http://www.kme4313.cn/
http://www.bnb6875.cn/
http://www.yio4898.cn/
http://www.yat8046.cn/
http://www.mtl1611.cn/
http://www.ltz6047.cn/
http://www.wsa2392.cn/
http://www.xfz1235.cn/
http://www.fsh3334.cn/
http://www.hmb6894.cn/
http://www.zis3531.cn/
http://www.cyj2776.cn/
http://www.bpj4889.cn/
http://www.dvu3043.cn/
http://www.vrc3090.cn/
http://www.ecx0415.cn/
http://www.oyt3985.cn/
http://www.mfu9569.cn/
http://www.lev2249.cn/
http://www.bdw7316.cn/
http://www.yyf8629.cn/
http://www.baq6972.cn/
http://www.xcd5039.cn/
http://www.bed0568.cn/
http://www.hzg6462.cn/
http://www.dec9975.cn/
http://www.hyt6211.cn/
http://www.ysz1764.cn/
http://www.xah7645.cn/
http://www.rlo9176.cn/
http://www.iaz8522.cn/
http://www.mng2781.cn/
http://www.axs9870.cn/
http://www.csv7317.cn/
http://www.kpq2047.cn/
http://www.igm8568.cn/
http://www.cgn5379.cn/
http://www.axz7045.cn/
http://www.rfz4575.cn/
http://www.cxb4532.cn/
http://www.qri2046.cn/
http://www.zps7191.cn/
http://www.zcl0267.cn/
http://www.ozn1702.cn/
http://www.zbb7727.cn/
http://www.vtl3405.cn/
http://www.zht3189.cn/
http://www.zzl7747.cn/
http://www.abd5921.cn/
http://www.hch9349.cn/
http://www.hwp3498.cn/