2010-10-17 18 views
7

Có một vấn đề thường gặp khi viết các trình trợ giúp Html được nhập mạnh mẽ. Vấn đề là cách lấy cặp tên/giá trị thuộc tính. Giả sử chúng ta có sau Html khai helper:expression.Compile() vs ModelMetadata.FromLambdaExpression

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

Có một số giải pháp tôi thấy: 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. nhận tên thành viên duy nhất sử dụng 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; 
} 

Tất cả chúng có triển khai khác nhau từ cái nhìn đầu tiên (được sử dụng Reflector để điều tra) nhưng tôi không đào sâu vào.

Tôi đã mắc kẹt với rất nhiều cách để giải quyết vấn đề và muốn biết giải pháp nào TỐT HƠN cho các tình huống khác nhau và TẠI SAO?

Tôi sẽ đánh giá cao sự giúp đỡ nào

Trả lời

3

Các giải pháp này được sử dụng cho hai ngữ cảnh khác nhau.

1) Được sử dụng bởi các chế độ xem để tiếp tục tiền tố các trường html chuẩn bị cho mô hình ràng buộc và hầu như không có gì để làm với ModelMetadata. Mã này sẽ cung cấp "Customer.Addresses [0] .City" trong trường hợp bạn cần làm một biểu mẫu phụ.

Phương pháp này chỉ quan tâm đến PropertyInfo.Name. Điều này sẽ không bao giờ cung cấp cho bạn nội dung thuộc tính [DisplayName].

2) Là những gì được sử dụng chủ yếu để làm việc với Modelmetadata. Tôi muốn sử dụng phương pháp hai 99% thời gian trừ khi bạn cần phải giải quyết # 1. Điều này cũng sẽ nhận được siêu dữ liệu được liên kết với thuộc tính DataAnnotations. Sill này cung cấp cho bạn nội dung của [DisplayName].

+0

Cảm ơn bạn. Bạn có biết có bất kỳ sự khác biệt nào trong các cách tiếp cận khác nhau cho các biến "giá trị" không? Có lẽ một số lợi ích hiệu suất cho một số trường hợp? – Cheburek

Các vấn đề liên quan