Używam programu ASP.NET MVC 2 Preview 2 i napisałem niestandardową metodę rozszerzenia HtmlHelper, aby utworzyć etykietę za pomocą wyrażenia. TModel pochodzi z prostej klasy z właściwościami, a właściwości mogą mieć atrybuty określające wymagania walidacji. Próbuję dowiedzieć się, czy istnieje atrybut na właściwość wyrażenie reprezentuje w mojej metodzie etykiety.Uzyskaj niestandardowe atrybuty z Lambda Property Expression
Kod dla klasy i etykiety:
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);
}
Następnie nazwałbym etykietę tak:
Html.Label(x => x.MyProperty, "My Label")
Czy istnieje sposób, aby dowiedzieć się, czy majątek wartości ekspresji przekazane do metody Etykieta ma atrybut Wymagany?
Uznałem, że wykonanie poniższych czynności daje mi atrybut, jeśli istnieje, ale mam nadzieję, że istnieje lepszy sposób osiągnięcia tego.
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>"));
}
Jest to o wiele lepiej, dzięki! Czy można zmienić metodę GetAttribute na metodę rozszerzenia wyrażenia? Umożliwiłoby to łatwe sprawdzenie dowolnego wyrażenia dla atrybutu. – Bernd
+1 Świetny człowiek kodu! Wspomnę o tym w mojej książce "Książka kucharska ASP.NET MVC" (http://groups.google.com/group/aspnet-mvc-2-cookbook-review) –
Użyłem tego rozwiązania przez długi czas, ale ostatnio powtórzył go podczas pracy z EntityFramework w 'DbSet.Include', który nie może poprawnie załadować zagnieżdżonych właściwości (np.' Thing1.Thing2' z 'o => o.Thing1.Thing2'). Istnieje [nieco bardziej rozbudowana wersja] (http://stackoverflow.com/a/2916344/1037948) twojego, która bierze pod uwagę 'UnaryExpression', ale konwersja ciągów, którą sugerujesz, unikając [wydaje się być najłatwiejszą metodą] (http : //stackoverflow.com/a/17220748/1037948), aby uzyskać nazwę "w pełni kwalifikowaną". – drzaus