2011-10-05 20 views
5

Bazı örnekleri okuyorum ve yöntemleri görmeden önce [SOMETHING] ile kodu görmeye devam ediyorum ve bunun ne anlama geldiğini ve nasıl kullanıldığını öğrenmek istiyorum..NET MVC 3 semantik

Kendinizi tanımlayabilirsiniz [SOMETHING] veya bu şeylerin tanımlanmış bir listesi var mı?

İşte bu kodu kullanan bir kod örneği var. Burada Ne oluyor

[HandleError] 

public class HomeController : Controller 
{ 

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

     return View(); 
    } 

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

Hatta bazen

[HandleError (Order = 2)]

gibi de bunun parametreleri koydu. Bunun SUPER gibi önemli olduğunu düşünüyorum ancak okuduğum referans kitaplarının hiçbiri bunları kullanmadıklarını açıklamıyor.

Zamanın önündedir.

cevap

6

HandleError bir niteliktir. için

Kısa Giris

Nitelikler sınıflar, yapılar, alanlar, parametreleri, işlevleri ve argümanları önek, köşeli parantezler içinde bulunan Nitelikler ve bir sınıfta Özelliği devralmasını tarafından kendi tanımlayabilirsiniz. Yukarıdaki örnekte

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

} 

: Ayrıca bunun için geçerli olabilir ne kapsamını tanımlayan bir öznitelik ile öznitelik tanımını öneki

public class NameOfYourAttributeAttribute : Attribute { 

} 

: gibi bir özelliği oluşturulurken tipik biçimidir Sınıf için bir dekoratör olmaktan başka, sınıf için o kadar çok şey yoktur.

[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); 
      } 
     } 
    } 
} 
: sınıfları bir Eser özelliği verilebilir MSDN'den, bir örnek (http://msdn.microsoft.com/en-us/library/z919e8tw%28v=vs.80%29.aspx) göz önünde HandleError durumunda

, özellikle:

Onlar yansıma yoluyla görülebilir yararlı bilgiler sağlar. HandleError söz konusu olduğunda, denetleyicide herhangi bir özel durum atılırsa, Hata görünümünü ~/Görünümler/Paylaşılan//.

Daha fazla ayrıntı için http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx adresine bakın.

+0

Harika cevap. Bu çok yardımcı oldu. – Dan

2

Bunlar, attributes olarak adlandırılır ve C# 'nin ortak bir özelliğidir. Bunları kendiniz bildirebilirsiniz:

class SomeAttr : Attribute 
{ 

} 
2

attributes olarak adlandırılırlar ve yalnızca Attribute türetilmiş normal sınıflardır. Kendini kesinlikle tanımlayabilirsin.

MVC, yapılandırma göz önünde bulundurulduğunda sözleşmeyle yapıldığı için, işlevlerinizi özniteliklerle dekore edebilir ve çerçeve, sizden daha fazla müdahale olmadan, bunlarla ne yapacağınızı anlamaya çalışır. Örneğin, işlevinizi [HttpGet] ile süslediyseniz, yalnızca GET istekleri bunun üzerinden yönlendirilir, başka bir şey (POST gibi) başka bir işlev arar veya başka bir şey yoksa bir hata verir.

+0

[HttpGet] ve [HttpPost] 'un açıklaması için teşekkürler. Bunun gibi bir şey olduğunu düşündüm, ama açıklamak güzeldi. – Dan

+1

Bu ikisi, [Authorize] 'ile birlikte, MVC'deki özniteliklerin% 90'ından fazlasını alır :) – Blindy

+0

Confused Confuty Attack saldırılarını önlemek için' [ValidateAntiForgeryToken] 'unu unutma: http://haacked.com/ arşiv/2009/04/02/CSRF anatomi-of-the-attack.aspx – doctorless