2012-06-10 19 views
23

He creado HtmlHelper en asp.net mvc 4 razor view engine C#.Acceso a los atributos de Ayudantes Html personalizados en asp.net mvc 4 razor

¿Puedo pasar la propiedad ver modelo a mi clase de ayuda?

Por ejemplo, tengo propiedad

[Required] 
[Display(Name = "Your Lastname")] 
public string Lastname { get; set; } 

¿Puedo pasar esta propiedad a mi ayudador algo como esto @ Html.Example (modelo => model.Lastname) y de obtener datos en anotations ayudante (si esto se requiere campo ¿qué es el nombre para mostrar, etc.?

Gracias

Respuesta

38

El atributo [Display] enriquece los metadatos. Por lo tanto, podría obtener la información de los metadatos.

Por ejemplo, si desea recuperar el nombre de pantalla en el interior del ayudante:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     var displayName = metadata.DisplayName; 
     return new HtmlString(html.Encode(displayName)); 
    } 
} 

y luego si se supone que tiene una vista de modelo:

public class MyViewModel 
{ 
    [Required] 
    [Display(Name = "Your Lastname")] 
    public string Lastname { get; set; } 
} 

podría utilizar el ayudante en su opinión fuertemente tipada:

@model MyViewModel 

@Html.Example(x => x.Lastname) 

Supongamos que usted escribió un metadato personalizado en tributo:

public class FooBarAttribute : Attribute, IMetadataAware 
{ 
    public FooBarAttribute(string bar) 
    { 
     Bar = bar; 
    } 
    public string Bar { get; private set; } 

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

que utilizó para decorar su modelo con:

public class MyViewModel 
{ 
    [Required] 
    [FooBar("This is the bar")] 
    public string SomeBar { get; set; } 
} 

y luego dentro de su ayudante que se pudo obtener el atributo personalizado:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData); 
     if (metadata.AdditionalValues.ContainsKey("foo")) 
     { 
      var foo = metadata.AdditionalValues["foo"] as string; 
      return new HtmlString(html.Encode(foo)); 
     } 
     return MvcHtmlString.Empty; 
    } 
} 

ACTUALIZACIÓN:

Parece que usted n para buscar el mensaje Requerido. No hay idea de por qué necesita hacer esto en un asistente personalizado, pero aquí hay un ejemplo de cómo se puede lograr eso:

public static class HtmlHelpers 
{ 
    public static IHtmlString Example<TModel, TProperty>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TProperty>> ex 
    ) 
    { 
     var me = (ex.Body as MemberExpression); 
     if (me != null) 
     { 
      var required = me 
       .Member 
       .GetCustomAttributes(typeof(RequiredAttribute), false) 
       .Cast<RequiredAttribute>() 
       .FirstOrDefault(); 
      if (required != null) 
      { 
       var msg = required.FormatErrorMessage(me.Member.Name); 
       return new HtmlString(html.Encode(msg)); 
      } 
     } 
     return MvcHtmlString.Empty; 
    } 
} 
+2

Wow. Creo que eres increíble :) ¿Te ha dicho –

+0

y puedes decir cómo puedo encontrar el mensaje de datos requeridos? Quiero recibir este mensaje >>> data-val-date = "El campo Fecha de nacimiento debe ser una fecha". data-val-required = "El campo BirthDate es obligatorio. –

+0

' data-val-required' es un atributo del lado del cliente. Supongo que desea buscar el mensaje que usa el atributo Requerido. Actualizaré mi respuesta con un ejemplo. –

Cuestiones relacionadas