2011-10-28 10 views
5

Ho esteso l'helper HTML con un metodo che richiede un valore di attributo dalla proprietà del modello. Quindi ho definito un attributo personalizzato come tale.Impossibile ottenere il valore di attributo personalizzato in MVC3 HTML Helper

public class ChangeLogFieldAttribute : Attribute { 
     public string FieldName { get; set; } 
    } 

È utilizzato in questo modo nel mio modello.

[Display(Name = "Style")] 
    [ChangeLogField(FieldName = "styleid")] 
    public string Style { get; set; } 

Nel mio metodo di supporto, ho il seguente codice per ottenere il valore NomeCampo del mio attributo, se l'attributo viene utilizzato per la proprietà.

 var itemName = ((MemberExpression)ex.Body).Member.Name; 

     var containerType = html.ViewData.ModelMetadata.ContainerType; 
     var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault(); 
     if (attribute != null) { 
      itemName = attribute.FieldName; 
     } 

Tuttavia, quando raggiungo questo codice, ottengo un'eccezione perché il tipo di contenitore è null.

Non sono sicuro se sto facendo nulla di tutto ciò, ma ho tirato da circa 4 fonti diverse per arrivare così lontano. Se potessi suggerire una soluzione al mio problema o un'alternativa, sarei grato.

Grazie.

AGGIORNAMENTO CON SOLUZIONE

ho utilizzato la soluzione di Darin Dimitrov, anche se ho dovuto modificarlo un po '. Ecco cosa ho aggiunto. Ho dovuto verificare l'esistenza degli attributi metatdata e tutto andava bene.

 var fieldName = ((MemberExpression)ex.Body).Member.Name; 

     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("fieldName")) { 
      fieldName = (string)metadata.AdditionalValues["fieldName"]; 
     } 
+0

Per ottenere un nome di proprietà, è possibile utilizzare 'metadata.PropertyName' invece di '((MemberExpression) ex.Body) .Member.Name'. Questo però non funziona con i nomi dei campi, e non vedo alcun '.FieldName' o' .MemberName'. –

risposta

11

Si potrebbe fare i metadati di attributo a conoscenza:

public class ChangeLogFieldAttribute : Attribute, IMetadataAware 
{ 
    public string FieldName { get; set; } 

    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["fieldName"] = FieldName; 
    } 
} 

e poi dentro l'helper:

var metadata = ModelMetadata.FromLambdaExpression(ex, htmlHelper.ViewData); 
var fieldName = metadata.AdditionalValues["fieldName"]; 
Problemi correlati