2011-10-28 11 views
5

He ampliado el HTML helper con un método que necesita un valor de atributo de la propiedad del modelo. Así que he definido un atributo personalizado como tal.No se puede obtener el valor de atributo personalizado en MVC3 HTML Helper

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

Se usa así en mi modelo.

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

En mi método de ayuda, Tengo el siguiente código para obtener el valor de mi NombreCampo atributo, si el atributo se utiliza para la propiedad.

 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; 
     } 

Sin embargo, cuando llego a este código, recibo una excepción porque el containerType es nulo.

No estoy seguro de si estoy haciendo algo de esto correcto, pero saqué de 4 fuentes diferentes para llegar hasta aquí. Si pudiera sugerir una solución a mi problema o una alternativa, estaría agradecido.

Gracias.

ACTUALIZACIÓN CON SOLUCIÓN

que utiliza la solución de Darin Dimitrov, aunque tuve que ajustar algunos. Esto es lo que agregué. Tuve que verificar la existencia de los metadatos del atributo y todo fue bueno.

 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

Para obtener un nombre de propiedad, se puede usar 'metadata.PropertyName' en lugar de '((MemberExpression) ex.Body) .Member.Name'. Sin embargo, esto no funciona para los nombres de los campos, y no veo ningún '.FieldName' o' .MemberName'. –

Respuesta

11

Se podría hacer que el atributo de metadatos en cuenta:

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

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

y luego dentro del ayudante:

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