Estoy utilizando ASP.NET MVC 2 Preview 2 y he escrito un método de extensión HtmlHelper personalizado para crear una etiqueta con una expresión. El modelo TM es de una clase simple con propiedades y las propiedades pueden tener atributos para definir los requisitos de validación. Estoy tratando de averiguar si existe un cierto atributo en la propiedad que la expresión representa en mi método de etiqueta.Obtener atributos personalizados de Expresión de propiedad Lambda
El código de la clase y la etiqueta es:
public class MyViewModel
{
[Required]
public string MyProperty { get; set; }
}
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
public static string GetInputName<TModel, TProperty>(this Expression<Func<TModel, TProperty>> expression)
{
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
Entonces yo llamaría la etiqueta de la siguiente manera:
Html.Label(x => x.MyProperty, "My Label")
¿Hay una manera de averiguar si la propiedad en el valor de la expresión pasó al método de etiqueta tiene el atributo requerido?
Me di cuenta de que hacer lo siguiente me da el atributo si existe, pero tengo la esperanza de que hay una manera más clara de lograr esto.
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
System.Attribute.GetCustomAttribute(Expression.Property(Expression.Parameter(expression.Parameters[0].Type, expression.GetInputName()), expression.GetInputName()).Member, typeof(RequiredAttribute))
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
Esto es mucho mejor, gracias! ¿Es posible cambiar GetAttribute para que sea un método de extensión de Expression? Eso permitiría verificar fácilmente cualquier expresión de un atributo. – Bernd
+1 ¡Gran hombre código! Voy a mencionar esto en mi libro "ASP.NET MVC Cookbook" (http://groups.google.com/group/aspnet-mvc-2-cookbook-review) –
Así que utilicé esta solución durante mucho tiempo, pero recientemente lo volvió a visitar cuando trabajaba con 'DbSet.Include' de EntityFramework, que no carga correctamente las propiedades anidadas (es decir,' Thing1.Thing2' of 'o => o.Thing1.Thing2'). Hay una [versión un poco más robusta] (http://stackoverflow.com/a/2916344/1037948) que tiene en cuenta 'UnaryExpression', pero la conversión de cadenas que sugirió evitar [parece ser la manera más fácil] (http : //stackoverflow.com/a/17220748/1037948) para obtener el nombre "totalmente calificado". – drzaus