2010-10-17 13 views
7

Çok yazılan Html yardımcılarının yazılmasıyla ilgili yaygın bir sorun var. Sorun, özellik adı/değer çiftinin nasıl alınacağıdır. Bulduğumexpression.Compile() vs ModelMetadata.FromLambdaExpression

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

vardır birkaç çözümleri: 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. sadece MemberExpression kullanarak üye adı alınırken biz Html yardımcı ilanı sonrasında gelmiş varsayalım

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

Bunların hepsi, ilk bakıştan farklı bir uygulamaya sahiptir (araştırmak için Reflektör kullanılır) ama ben derinden kazmadım.

Sorunu çözmenin pek çok yolu ile uğraştım ve hangi durumun farklı durumlar için daha iyi olduğunu bilmek isterim NEDEN?

Ben Bu çözümler, iki farklı bağlamlarda kullanılan herhangi bir yardım

cevap

3

için takdir olacağım.

1) Model bağlama için hazırlık aşamasında html alanlarını doğru şekilde önek için görünümler tarafından kullanılır ve ModelMetadata ile neredeyse hiçbir ilgisi yoktur. Bu kod, bir alt form yapmanız gerektiğinde "Customer.Addresses [0] .City" değerini sağlayacaktır.

Bu yöntem yalnızca PropertyInfo.Name ile ilgilidir. Bu size asla bir [DisplayName] özniteliğinin içeriğini vermeyecektir.

2) Öncelikle Modelmetadata ile çalışmak için kullanılır. # 1'i çözmeniz gerekiyorsa, zamanın% 99'unu yöntem kullanırdım. Bu, DataAnnotations özniteliğiyle ilişkili meta verileri de alır. Bu eşik, size [DisplayName] içeriğini verir.

+0

Teşekkür ederiz. "Değer" değişkenleri için farklı yaklaşımlarda bir fark olduğunu biliyor musunuz? Belki bazı durumlar için bazı performans avantajları? – Cheburek

İlgili konular