關於MVC的特性(AuthorizeAttribute)的一些理解

許多 Web 應用程序要求在用戶登陸以後才授予其對受限制內容的訪問權限。html

在某些應用程序中,即便是登陸的用戶,也會限制他們能夠查看的內容或能夠編輯的字段。jquery

要限制對 ASP.NET MVC 視圖的訪問,您能夠限制對呈現視圖的操做方法的訪問。web

爲此,MVC 框架提供 AuthorizeAttribute 類。ajax

 

 

MVC的一些特性,以下:數據庫

  1. BindAttribute(限制實體屬性)
  2. RemoteAttribute(遠程驗證,須要頁面使用jquery.validate.js和jquery.validate.unobtrusive.js)
  3. HandleErrorAttribute(根據異常類型直接跳轉到相應的錯誤頁面)
  4. HiddenInputAttribute(在Model中直接控制頁面輸入框顯示,用處不大)

BindAttribute

使用BindAttribute的目的是限制用戶在提交form表單時使用合適且正確的值。當咱們提交一個表單時,就會檢查每個實體上綁定的特性。框架

假設咱們已經有下面一個Employee實體類:異步

  1. 複製代碼
    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

  1. 複製代碼
    [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命名空間下

 

 

Remote Attribute

假設咱們有一個註冊表單,裏面有郵箱文本框,當輸入郵箱後,咱們想檢查輸入的郵箱是否在數據庫中已經存在,若是存在,則不提交表單,這時咱們可使用RemoteAttribute,經過RemoteAttribute,咱們能夠在進入Action前自動先進行一些服務端驗證。

咱們能夠在下面的例子中使用RemoteAttribute:

  1. 複製代碼
    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方法將被執行並檢查郵箱是否存在。

  1. 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" })

來配合處理

我的認爲,該特性基本沒什麼用

 

HandleError Attribute

咱們已經有不少方法在MVC中處理異常,好比用try catch,或者使用Filter,或者經過第三方庫好比elmah。可是MVC也提供了一個HandleErrorAttribute去處理異常,以下:

  1. 複製代碼
    [HandleError()]
    public ActionResult CheckError()
      {
         int a = 10;
         int b = 0;
         int k = a / b;
         return View();
      }
    複製代碼

在web.config文件中,咱們在<system.web>中添加以下兩行:

  1. <customErrors mode ="On" defaultRedirect ="Error.cshtml">
    </customErrors>

在shared文件夾下建立一個視圖Error.cshtml,而後運行程序,若是運行上面的CheckError()方法,剛建立的Error.cshtml將會顯示出來。

還能夠根據異常類型的不一樣跳轉到不一樣的錯誤界面。

  1. 複製代碼
    [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();
           }
    複製代碼

能夠重寫該特性進行錯誤日誌記錄!調用方式有兩種:一、global全局註冊,二、加在控制器或Action上

使用 handleError attribute 有如下侷限: 

1. 不支持exception記錄
2. 沒法捕捉到500以外的http exception
3. controller以外拋出的異常沒法處理
4. ajax調用出現exception時,會將錯誤頁面內容返回

 

 

 

HiddenInput Attribute

若是咱們想對用戶隱藏一些實體字段,咱們可使用HiddenInput特性。

  1. 複製代碼
    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必須保持一致 

我的認爲,用處不大

相關文章
相關標籤/搜索