2010-10-17 4 views
7

Es gibt ein gemeinsames Problem, stark typisierte HTML-Helfer zu schreiben. Das Problem besteht darin, wie das Name/Wert-Paar der Eigenschaft abgerufen wird. Angenommen, wir folgende HTML-Hilfs Erklärung haben:expression.Compile() vs ModelMetadata.FromLambdaExpression

public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 

gibt es mehrere Lösungen, die ich gefunden: 1.

var value = expression.Compile()(helper.ViewData.Model); 
string name = ExpressionHelper.GetExpressionText(expression); 
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 

2.

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
Object value = metadata.Model; 
String name = metadata.PropertyName; 

3. Mitglied bekommen Name nur mit Member

string GetPropertyName<T>(Expression<Func<T>> property) 
{ 
    var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo; 
    if (propertyInfo == null) 
    { 
     throw new ArgumentException("The lambda expression 'property' should point to a valid Property"); 
    } 
    return propertyInfo.Name; 
} 

Alle von ihnen haben verschiedene Umsetzung von der ersten Seite (verwendet Reflektor zu untersuchen), aber ich habe nicht tief in.

Ich habe mit so vielen Möglichkeiten, Problem zu lösen und möchte gerne wissen, welche Lösung für verschiedene Situationen besser ist und WARUM?

Ich werde für jede Hilfe

Antwort

3

Diese Lösungen werden für zwei unterschiedliche Kontexte werden zu schätzen wissen.

1) Wird von den Ansichten verwendet, um die HTML-Felder in Vorbereitung auf die Modellbindung korrekt zu markieren, und hat fast nichts mit ModelMetadata zu tun. Dieser Code wird "Customer.Addresses [0] .City" bereitstellen, wenn Sie ein Unterformular erstellen müssen.

Diese Methode interessiert nur PropertyInfo.Name. Dies gibt Ihnen nie den Inhalt eines [DisplayName] Attributs.

2) Wird hauptsächlich für die Arbeit mit Modelmetadata verwendet. Ich würde Methode zwei 99% der Zeit verwenden, außer wenn Sie # 1 lösen müssen. Dadurch werden auch die mit dem DataAnnotations-Attribut verknüpften Metadaten abgerufen. Diese Schwelle gibt Ihnen den Inhalt von [DisplayName].

+0

Danke. Wissen Sie, gibt es einen Unterschied in verschiedenen Ansätzen für "Wert" -Variablen? Vielleicht einige Leistungsvorteile für den einen oder anderen Fall? – Cheburek