2012-10-06 24 views
13

Tôi đang cố tạo một HtmlHelper để tạo các trường biểu mẫu tương thích với Bootstrap. Mục tiêu đầu tiên của tôi là tạo một HtmlHelper để tạo div xung quanh:Lấy tên thuộc tính đầy đủ bằng cách sử dụng ModelMetadata

<div class="control-group"> ... </div> 

Làm theo lời khuyên tuyệt vời ở đây và ở đây tôi đã cố gắng làm cho nó hoạt động tương đối nhanh. Nhưng nó không phải lúc nào cũng hiệu quả.

Tôi có một ViewModel với thuộc tính phức tạp, vì vậy trong biểu mẫu của tôi, tôi truy cập vào trường m=>m.Complex.Element. Trong helper của tôi, tôi kiểm tra phần tử để xác nhận lỗi. Tôi sử dụng ModelMetadata.FromLambdaExpression(expression, html.ViewData). Siêu dữ liệu tôi quay lại có tên thuộc tính Element và không phải là Complex.Element.

Khi tôi kiểm tra ModelState cho thuộc tính này, tôi không thể tìm thấy nó, bởi vì ModelState giữ nguyên tên - Complex.Element.

Tôi có thể tìm kiếm các kết quả khớp một phần, hy vọng không có phần tử nào khác, nhưng điều đó có vẻ như một lỗi khó chịu đang chờ xảy ra. Làm cách nào tôi có thể nhận được tên thuộc tính đầy đủ từ biểu thức?

Trả lời

27

Thật là một điều tốt khi các nguồn MVC được mở ra. Cách thích hợp để lấy tên thuộc tính ModelState là sử dụng

var propertyName = ExpressionHelper.GetExpressionText(expression); 
+1

+1. Tôi cũng có cùng một vấn đề. Câu trả lời của bạn đã giúp tôi :) –

6

Tôi đã sử dụng các mục sau đây để tải nó cho mô hình hiện tại trước đây, bạn có thể phải gắn thêm tên thuộc tính vào đây để lấy nó cho thuộc tính.

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; 

Nếu không, hãy rút ra phản xạ/ilspy/bất cứ điều gì và kiểm tra trình soạn thảo của bạn.

+0

Tôi nhận được tiền tố trống. Tôi sẽ xem xét các nguồn MVC 3 và xem cách Microsoft giải quyết vấn đề này. Tôi hy vọng một người khác biết điều đó và có thể giúp tôi tiết kiệm thời gian. – zmbq

+0

Tôi sử dụng tính năng này (không có "ViewContext.") Trong phần mở rộng HtmlHelper và Trình chỉnh sửa/Hiển thị mẫu của tôi. Hoạt động tốt cho đến nay – Ingo

+1

khi viết phần mở rộng trợ giúp html của riêng bạn, bạn có thể lấy nó từ đó 'htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix' – Odys

4

Tôi đã sử dụng kết hợp cả hai câu trả lời cho thuộc tính tôi cần. Cùng với nhau, cả hai câu trả lời này đều cung cấp một thuộc tính làm việc mà tôi có thể sử dụng trong cả hai khung nhìn và các mẫu trình soạn thảo lồng nhau. Đây là ví dụ của tôi:

public static MvcHtmlString HasErrorClassFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    string expressionText = ExpressionHelper.GetExpressionText(expression); 

    string htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix; 

    string fullyQualifiedName; 

    if (htmlFieldPrefix.Length > 0) 
    { 
     fullyQualifiedName = string.Join(".", htmlFieldPrefix, expressionText); 
    } 
    else 
    { 
     fullyQualifiedName = expressionText; 
    } 

    bool isValid = htmlHelper.ViewData.ModelState.IsValidField(fullyQualifiedName); 

    if (!isValid) 
    { 
     return MvcHtmlString.Create("has-error"); 
    } 

    return MvcHtmlString.Empty; 
} 
Các vấn đề liên quan