Obter atributos personalizados da expressão de propriedade do Lambda
Eu estou usando o ASP.NET MVC 2 Preview 2 e escrevi um método de extensão HtmlHelper personalizado para criar um rótulo usando uma expressão. O TModel é de uma classe simples com propriedades e as propriedades podem ter atributos para definir requisitos de validação. Eu estou tentando descobrir se um determinado atributo existe na propriedade que a expressão representa no meu método de rótulo.
O código para a classe e o rótulo é:
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);
}
Então eu chamaria o rótulo assim:
Html.Label(x => x.MyProperty, "My Label")
Existe uma maneira de descobrir se a propriedade no valor da expressão passada para o método Label possui o atributo Required?
Eu descobri que fazer o seguinte me traz o atributo, se existir, mas espero que haja uma maneira mais limpa de conseguir isso.
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>"));
}