Ich verwende ASP.NET MVC 2 Preview 2 und habe eine benutzerdefinierte HtmlHelper-Erweiterungsmethode geschrieben, um mithilfe eines Ausdrucks eine Beschriftung zu erstellen. Das TModel stammt aus einer einfachen Klasse mit Eigenschaften und die Eigenschaften können Attribute haben, um Validierungsanforderungen zu definieren. Ich versuche herauszufinden, ob ein bestimmtes Attribut für die Eigenschaft existiert, die der Ausdruck in meiner Label-Methode darstellt.Benutzerdefinierte Attribute aus dem Lambda-Eigenschaftsausdruck abrufen
Der Code für die Klasse und Label:
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);
}
Dann würde ich das Etikett wie folgt aufrufen:
Html.Label(x => x.MyProperty, "My Label")
Gibt es eine Möglichkeit in der Ausdruckswert, wenn die Eigenschaft, um herauszufinden, an die Label-Methode übergeben wurde, hat das Required-Attribut?
Ich fand heraus, dass das folgende tun mir das Attribut, wenn es existiert, aber ich hoffe, es gibt eine sauberere Möglichkeit, dies zu erreichen.
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>"));
}
Das ist viel besser, danke! Ist es möglich, GetAttribute zu einer Erweiterungsmethode des Ausdrucks zu ändern? Dies würde eine einfache Überprüfung eines Ausdrucks für ein Attribut ermöglichen. – Bernd
+1 Großer Code Mann! Ich werde dies in meinem Buch "ASP.NET MVC Cookbook" erwähnen (http://groups.google.com/group/aspnet-mvc-2-cookbook-review) –
Also habe ich diese Lösung für eine lange Zeit verwendet, aber kürzlich Ich habe es noch einmal gelesen, als ich mit EntityFrameworks "DbSet.Include" gearbeitet habe, das es versäumt hat, verschachtelte Eigenschaften richtig zu laden (zB 'Thing1.Thing2' von' o => o.Thing1.Thing2'). Es gibt eine [etwas robustere Version] (http://stackoverflow.com/a/2916344/1037948) von Ihnen, die "UnaryExpression" berücksichtigt, aber die Stringkonvertierung, die Sie vorgeschlagen haben, [scheint der einfachste Weg zu sein] (http : //stackoverflow.com/a/17220748/1037948) um den "vollqualifizierten" Namen zu erhalten. – drzaus