許多 Web 應用程序要求在用戶登陸以後才授予其對受限制內容的訪問權限。html
在某些應用程序中,即便是登陸的用戶,也會限制他們能夠查看的內容或能夠編輯的字段。jquery
要限制對 ASP.NET MVC 視圖的訪問,您能夠限制對呈現視圖的操做方法的訪問。web
爲此,MVC 框架提供 AuthorizeAttribute 類。ajax
MVC的一些特性,以下:數據庫
BindAttribute(限制實體屬性)
RemoteAttribute(遠程驗證,須要頁面使用jquery.validate.js和jquery.validate.unobtrusive.js)
HandleErrorAttribute(根據異常類型直接跳轉到相應的錯誤頁面)
HiddenInputAttribute(在Model中直接控制頁面輸入框顯示,用處不大)
使用BindAttribute的目的是限制用戶在提交form表單時使用合適且正確的值。當咱們提交一個表單時,就會檢查每個實體上綁定的特性。框架
假設咱們已經有下面一個Employee實體類:異步
public class Employee { public string Name { get; set; } public string Email { get; set; } public string Address { get; set; } public string PhoneNo { get; set; } }
創建一個EmployeeController,裏面添加兩個Action:ide
[HttpGet] public ActionResult EmployeeRegister() { return View(); } [HttpPost] public ActionResult EmployeeRegister(Employee emp) { return View(); }
給第一個Action創建視圖,而且發送post表單數據過來。post
這樣在第二個Action中,就會接收到參數,自動轉成Employee類,包含4個屬性spa
如今若是咱們只想提交Email,Name和PhoneNo,而咱們不想提交Address,這時咱們能夠在實體類上添加以下特性:
[Bind(Exclude="Address")] public class Employee { public string Name { get; set; } public string Email { get; set; } public string Address { get; set; } public string PhoneNo { get; set; } }
此時其餘三個屬性正常,Address變成了null.
咱們也能夠將BindAttribute直接用在Action的參數中,像下面這樣:
[HttpPost] public ActionResult EmployeeRegister([Bind(Exclude = "Address")]Employee emp) { return View(); }
注意:BindAttribute位於System.Web.Mvc命名空間下
假設咱們有一個註冊表單,裏面有郵箱文本框,當輸入郵箱後,咱們想檢查輸入的郵箱是否在數據庫中已經存在,若是存在,則不提交表單,這時咱們可使用RemoteAttribute,經過RemoteAttribute,咱們能夠在進入Action前自動先進行一些服務端驗證。
咱們能夠在下面的例子中使用RemoteAttribute:
public class Employee { public string Name { get; set; } [Remote("CheckEmail","Employee",ErrorMessage="Email is already exist")] public string Email { get; set; } public string Address { get; set; } public string PhoneNo { get; set; } }
RemoteAttribute的第一個參數是一個Action名字,第二個是Controller名字,第三個是若是郵箱已存在後顯示給用戶看的提示信息。當咱們輸入完郵箱後,CheckEmail方法將被執行並檢查郵箱是否存在。
public JsonResult CheckEmail(string Email) { //Check here in database if it exist in database return true else false. return Json(false, JsonRequestBehavior.AllowGet); }
此時頁面上郵箱的輸入框一旦發生onchange,就會自動發送異步請求到CheckEmail方法,頁面可使用以下代碼:
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
來配合處理
我的認爲,該特性基本沒什麼用
咱們已經有不少方法在MVC中處理異常,好比用try catch,或者使用Filter,或者經過第三方庫好比elmah。可是MVC也提供了一個HandleErrorAttribute去處理異常,以下:
[HandleError()] public ActionResult CheckError() { int a = 10; int b = 0; int k = a / b; return View(); }
在web.config文件中,咱們在<system.web>中添加以下兩行:
<customErrors mode ="On" defaultRedirect ="Error.cshtml"> </customErrors>
在shared文件夾下建立一個視圖Error.cshtml,而後運行程序,若是運行上面的CheckError()方法,剛建立的Error.cshtml將會顯示出來。
還能夠根據異常類型的不一樣跳轉到不一樣的錯誤界面。
[HandleError(ExceptionType=typeof(DivideByZeroException),View="嘗試除以0的View")] [HandleError(ExceptionType = typeof(NullReferenceException), View = "引用null對象的View")] public ActionResult CheckError() { int a = 10; int b = 0; int k = a / b; return View(); }
使用 handleError attribute 有如下侷限:
1. 不支持exception記錄
2. 沒法捕捉到500以外的http exception
3. controller以外拋出的異常沒法處理
4. ajax調用出現exception時,會將錯誤頁面內容返回
若是咱們想對用戶隱藏一些實體字段,咱們可使用HiddenInput特性。
public class Employee { [HiddenInput(DisplayValue=false)] public string Name { get; set; } [Remote("CheckEmail","Employee",ErrorMessage="Email is already exist")] public string Email { get; set; } public string Address { get; set; } public string PhoneNo { get; set; } }
這樣頁面上Name的輸入框將不會出現,必須使用以下代碼纔可實現控制效果:
@Html.EditorFor(model => model.Name, new {})
強類型控制,Name和頁面頭部引用@model xxx.Models.Employee必須保持一致