2011-10-05 101 views
5

我正在閱讀一些示例,並且在方法之前我一直看到[SOMETHING]的代碼,我想知道它是什麼以及它是如何使用的。.NET MVC 3語義

你能否定義你自己的[SOMETHING]或者是否有這些東西的定義列表?

這裏有一些代碼示例,我發現使用這個東西,但沒有解釋任何有關它。

[HandleError] 

public class HomeController : Controller 
{ 

    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

有時,他們甚至把參數,它太像

[的HandleError(訂單= 2)]

請告訴我怎麼回事。我覺得這是超級重要的,但我沒有讀過的參考書解釋他們只是使用它們。

提前致謝。

回答

6

HandleError是一個屬性。

簡介(英文)屬性

屬性包含在方括號中,前綴類,結構,字段,參數,功能和參數,你可以通過在類的屬性繼承自己定義。創建一個屬性的典型格式是這樣的:

[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct)] 
public class NameOfYourAttributeAttribute : Attribute { 

} 

在上面的例子:

public class NameOfYourAttributeAttribute : Attribute { 

} 

您也可以與定義什麼可以適用於範圍的屬性前綴的屬性定義,對於類來說真的沒有那麼多,除了它只是一個類或結構的裝飾器。考慮一個來自MSDN的例子,其中類可以被賦予一個Author屬性(http://msdn.microsoft.com/en-us/library/z919e8tw%28v=vs.80%29.aspx):

[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Struct, AllowMultiple = true)] 
public class Author : System.Attribute 
{ 
    string name; 
    public double version; 

    public Author(string name) 
    { 
     this.name = name; 
     version = 1.0; // Default value 
    } 

    public string GetName() 
    { 
     return name; 
    } 
} 

[Author("H. Ackerman")] 
private class FirstClass 
{ 
    // ... 
} 

// There's some more classes here, see the example link... 

class TestAuthorAttribute 
{ 
    static void Main() 
    { 
     PrintAuthorInfo(typeof(FirstClass)); 
     PrintAuthorInfo(typeof(SecondClass)); 
     PrintAuthorInfo(typeof(ThirdClass)); 
    } 

    private static void PrintAuthorInfo(System.Type t) 
    { 
     System.Console.WriteLine("Author information for {0}", t); 
     System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t); // reflection 

     foreach (System.Attribute attr in attrs) 
     { 
      if (attr is Author) 
      { 
       Author a = (Author)attr; 
       System.Console.WriteLine(" {0}, version {1:f}", a.GetName(), a.version); 
      } 
     } 
    } 
} 

在的HandleError的情況下,特別是:

它們提供可經由反射可見的有用信息。在HandleError的情況下,這意味着如果在控制器內引發任何異常,它將渲染〜/ Views/Shared /中的錯誤視圖。

請參閱http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx瞭解更多詳情。

+0

真棒回答。這有很大幫助。 – Dan

2

這些被稱爲attributes,並且是C#的一個共同特徵。 你可以自己聲明它們:

class SomeAttr : Attribute 
{ 

} 
2

他們被稱爲attributes,他們只是從Attribute派生的正常類。你絕對可以定義你自己的。

由於MVC是基於配置的慣例制定的,您可以用屬性來修飾您的函數,框架將嘗試找出如何處理它們,而無需您進行任何干預。例如,如果您用[HttpGet]修飾函數,則只有GET請求會通過它進行路由,但其他任何(如POST)都將查找另一個函數,或者如果沒有其他函數存在,則會拋出錯誤。

+0

感謝您對[HttpGet]和[HttpPost]的解釋。我認爲這樣的事情正在發生,但很高興看到它解釋。 – Dan

+1

這兩個和'[Authorize]'一起會讓你通過MVC中90%的屬性:) – Blindy

+0

不要忘記'[ValidateAntiForgeryToken]'有助於防止混淆的副攻擊:http://haacked.com/存檔/ 2009/04/02 /解剖的,CSRF,attack.aspx – doctorless