2010-10-17 7 views
7

Powszechnie pojawia się problem polegający na pisaniu mocno napisanych helperów HTML. Problem polega na tym, jak pobrać parę nazwa/wartość właściwości. że mamy następujący kod HTML deklaracji pomocnika:expression.Compile() vs ModelMetadata.FromLambdaExpression

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

Istnieje kilka rozwiązań znalazłem: 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. uzyskiwanie nazwy użytkownika tylko przy użyciu MemberExpression

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; 
} 

Wszystkie one mają różną implementację od pierwszego spojrzenia (użył reflektora do zbadania), ale nie zagłębiłem się głęboko.

Utknąłem na tyle sposobów, aby rozwiązać problem i chciałbym wiedzieć, które rozwiązanie jest LEPSZE dla różnych sytuacji i DLACZEGO?

Będę wdzięczni za wszelką pomoc

Odpowiedz

3

Rozwiązania te stosowane są do dwóch różnych kontekstach.

1) Jest używany przez widoki do prawidłowego prefixu pól html w ramach przygotowań do wiązania modelu i nie ma prawie nic wspólnego z ModelMetadata. Ten kod będzie zawierał "Customer.Addresses [0] .City" w przypadku, gdy musisz wykonać podrzędny formularz.

Ta metoda dba tylko o PropertyInfo.Name. To nigdy nie da ci zawartości atrybutu [DisplayName].

2) To, co jest używane przede wszystkim do pracy z Modelmetadata. Użyłbym metody dwa 99% czasu, chyba że musisz rozwiązać # 1. Spowoduje to również pobranie metadanych związanych z atrybutem DataAnnotations. Ten parapet daje ci treść [DisplayName].

+0

Dziękuję. Czy wiesz, że jest jakaś różnica w różnych podejściach dla zmiennych "wartości"? Może niektóre korzyści wydajności w niektórych przypadkach? – Cheburek