2011-10-05 24 views
5

Estoy leyendo algunos ejemplos y sigo viendo el código con [ALGO] antes de los métodos y me gustaría saber cómo se llama y cómo se usa..NET semántica MVC 3

¿Puedes definir tu propio [ALGO] o hay una lista definida de estas cosas?

Aquí hay algunos ejemplos de código que encontré que usan esta cosa pero no explican nada al respecto.

[HandleError] 

public class HomeController : Controller 
{ 

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

     return View(); 
    } 

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

A veces incluso poner parámetros en ella también como

[HandleError (Orden = 2)]

¿Qué está pasando aquí. Siento que esto es SUPER importante pero ninguno de los libros de referencia que he leído lo explican, simplemente los usan.

Gracias de antemano.

Respuesta

6

HandleError es un atributo.

breve introducción a los atributos

Los atributos se encuentran entre corchetes, anteponiendo clases, estructuras, campos, parámetros, funciones y argumentos, y se puede definir su propio heredando de atributo en una clase. El formato típico de la creación de un atributo es como tal:

public class NameOfYourAttributeAttribute : Attribute { 

} 

También puede prefijar su definición de atributo con un atributo que define el alcance de lo que se puede aplicar a:

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

} 

En el ejemplo anterior , realmente no hay mucho para la clase, aparte de ser simplemente un decorador para una clase o una estructura. Consideremos un ejemplo de la MSDN, donde las clases se puede dar un atributo Autor (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); 
      } 
     } 
    } 
} 

En el caso de HandleError, específicamente:

proporcionan información útil que puede ser visto a través de la reflexión. En el caso de HandleError, significa que si se arroja alguna excepción dentro del controlador, se mostrará la vista Error en ~/Views/Shared /.

Consulte http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx para obtener más información.

+0

Awesome answer. Eso ayudó mucho. – Dan

2

Se llaman attributes, y son una característica común de C#. Se puede declarar por sí mismo:

class SomeAttr : Attribute 
{ 

} 
2

Se llaman attributes y son solo clases normales derivadas de Attribute. Definitivamente puedes definir el tuyo.

Dado que MVC se realiza con la convención sobre la configuración en mente, puede decorar sus funciones con atributos y el marco tratará de descubrir qué hacer con ellas sin más intervención de usted.

Por ejemplo, si decora su función con [HttpGet], solo se enrutarán las solicitudes GET, cualquier otra cosa (como POST) buscará otra función, o arrojará un error si no hay nada más presente.

+0

Gracias por la explicación de [HttpGet] y [HttpPost]. Pensé que algo así estaba pasando, pero es bueno verlo explicado. – Dan

+1

Esos dos, junto con '[Authorize]', le guiarán por el 90% de los atributos en MVC :) – Blindy

+0

No se olvide de '[ValidateAntiForgeryToken]' para ayudar a prevenir los ataques adjuntos confusos: http://haacked.com/ archivo/2009/04/02/anatomy-of-csrf-attack.aspx – doctorless