2012-12-21 31 views
7

Tôi muốn có tùy chỉnh Html.DateTimePickerFor(a => a.Fields[0].Id, value)Làm thế nào để viết tùy chỉnh ASP.NET MVC HTML Helper như Html.TextBoxFor và đặt tên đúng thuộc tính

nên kết quả sẽ như thế này:

<div name="Fields[0].Id"></div> 

Hiện nay tôi sử dụng Html.DatetimePicker("Fields[0].Id", value) và nó hoạt động hoàn hảo, nhưng tôi wan để tạo ra tên năng động.

Vì vậy, câu hỏi đặt ra là làm thế nào để đặt đúng thuộc tính "name"?

+0

Khi bạn cố gắng tạo phiên bản 'TextBoxFor' cho trường Ngày giờ hoặc mẫu' EditFor' cho một trường cụ thể? Tôi nghĩ đây là yếu tố quan trọng nhất vào lúc này. –

Trả lời

4

Hãy thử điều này. Nó làm việc cho tôi.

public static MvcHtmlString DateTimePickerFor<TModel, TProp>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProp>> expression, object htmlAttributes) 
    { 
     string name = ExpressionHelper.GetExpressionText(expression); 
     ... rest of code here 
    } 

Phép thuật đến từ System.Web.Mvc.ExpressionHelper.GetExpressionText(). Khi bạn có tên từ biểu thức của mình, bạn có thể áp dụng tên đó cho div của mình.

GetExpressionText()

+0

Hãy cẩn thận với phương pháp này vì nó bỏ qua 2 thứ 'NameFor()' thực hiện: 1) mã hóa thuộc tính và 2) tên đủ điều kiện. Xem nguồn MVC, nơi tên được tiếp tục đủ điều kiện bằng cách gọi: 'html.ViewData.TemplateInfo.GetFullHtmlFieldName (name)' –

+0

Cool! Chính xác những gì tôi muốn. – Sergey

+0

@TimMedora - phiên bản nào của mvc dành cho? Tôi thấy nó trong phiên bản hiện tại của nguồn, nhưng trong ứng dụng MVC3 mà tôi đã kéo đoạn mã của mình, tôi không thấy phương pháp đó. Chỉ MVC4 thôi sao? Nếu bạn có một ứng dụng MVC4, thì giải pháp của bạn có vẻ như là cách tốt hơn để đi. – hawkke

2

Hãy thử một cái gì đó như thế này (chuyển thể từ mã làm việc):

public static IHtmlString DateTimePickerFor<TModel, TValue>(
    this HtmlHelper<TModel> helper, 
    Expression<Func<TModel, TValue>> expression, 

    // other input parameters as needed 

) { 
    // metadata gives you access to a variety of useful things, such as the 
    // display name and required status 
    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    string markup = ""; // markup for your input    

    var name = helper.NameFor(expression); // getting the name 

    return MvcHtmlString.Create(markup ); 
} 
Các vấn đề liên quan