2009-07-24 6 views
5

Eventuali duplicati:
Why does my .NET Attribute not perform an action?C# eseguire codice all'interno attributo personalizzato

Ciao,

Questo può soundlike una domanda molto stupida e non so che cosa è possibile qui come tutti le esercitazioni "attributo personalizzato" sulla rete sono praticamente le stesse e non affrontano ciò che voglio fare. Ho visto del codice là fuori dove il codice è scritto all'interno delle classi di attributi, ad esempio: Logging with ASP.NET MVC Action Filters e mi chiedo come mai questo codice verrà mai eseguito.

Se ho ad esempio, il seguente codice:

public class Test 
{ 
    [RestrictedAttribute("RegisteredMember")] 
    public void DoSomething() 
    { 
     //this code can only be executed if the logged-in user 
     //is a member of the RegisteredMember group 
    } 
} 

Poi l'attributo personalizzato RestrictedAttribute sarebbe qualcosa di simile a questo:

[AttributeUsage(AttributeTargets.Method)] 
public class RestrictedAttribute : System.Attribute 
{ 
    /// <summary> 
    /// Make this code restricted to users with a required role 
    /// </summary> 
    /// <param name="requiredRole">The role required to execute this method</param> 
    public RestrictedAttribute(string requiredRole) 
    { 
     //validate if member is in role, else throw exception 
     throw new MemberNotInRoleException(requiredRole); 
    } 
    public new string ToString() { 
     return "Access needs to be granted"; 
    } 

} 

Ora il problema è che non riesco a ottenere il MemberNotInRoleException da lanciare quando eseguo il metodo Test.DoSomething().

Forse mi manca solo l'intero concetto di attributi personalizzati, sentitevi liberi di spiegare.

+0

Dupe: http://stackoverflow.com/questions/1164978/c-attribute-actions-and-instance-values ​​ –

+2

È necessario ereditare l'attributo da ActionFilterAttribute e sovrascrivere il metodo OnActionExecuting per farlo eseguire in MVC . –

+1

Non penso che questo sia un vero e proprio capriccio, dato che è il comportamento di MCV che sta annebbiando il problema, gli indirizzi di riferimento di Mehrdad attribuiscono direttamente ed è una buona chiamata, ma qui c'è una sfumatura che può aiutare gli MVC a cercare di affrontare il taglio trasversale preoccupazioni nelle loro soluzioni, come la convalida e la serializzazione JSON/XML. –

risposta

2

Il modo in cui si guardano gli attributi suona proprio all'inizio, ma ripensateci. Ciò che stai facendo veramente è decorare la tua classe o qualsiasi altra cosa in modo che qualcosa che funzioni con esso possa prendere una decisione, non in modo che la classe stessa possa prendere una decisione. Ciò mi ha offuscato dal modo in cui è possibile utilizzare gli attributi actionfilter in MVC, che sembrano fare qualcosa, ma è il framework che seleziona gli eventi e utilizza l'attributo di conseguenza. Di solito cerco di pensare ad attributi come commenti per il mio programma con cui lavorare.