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.FieldViewBag
它是動態類型,對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: Anyspublic async Task<ActionResult> Index(){//睡眠,模擬長任務Thread.Sleep(5000000);return View("Testpy");}}?
?
7 擴展控制器
基類控制器
定義一個基類控制器,以便處理異?;驘o法找到請求對應的操作。
注意如果控制器使用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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的ASP.NET MVC编程——控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 2777 [AHOI2016初中组
- 下一篇: 走近webpack(3)--图片的处理