2010-08-18 17 views
5

Khi sử dụng mã sau, id của trường và id trong thuộc tính cho nhãn không giống nhau.LabelFor và TextBoxFor không tạo cùng một id

<%: Html.LabelFor(x => x.Localizations["en"]) %> => Localizations[en] 
<%: Html.TextBoxFor(x=> x.Localizations["en"]) %> => Localizations_en_ 

<%: Html.LabelFor(x => x.Localizations["en"].Property) %> 
     => Localizations[en]_Property 
<%: Html.TextBoxFor(x=> x.Localizations["en"].Property) %> 
     => Localizations_en__Property 

Tôi đã tìm mã theo phản xạ và thấy rằng cách tạo ra các giá trị khác nhau. Không sử dụng cùng một phương thức trợ giúp.

NhãnĐể sử dụng HtmlHelper.GenerateIdFromName và TextBoxFor sử dụng TagBuilder#GenerateId.

Có ai biết lý do cho việc này hay giải pháp thay thế (ngoại trừ viết toàn bộ bộ đầu vào/textarea/người trợ giúp chọn riêng của bạn)? hay nó là một con bọ nhỉ?

UPDATE:

Vì tôi nào sử dụng một helper html cho nhãn với một tham số thứ hai cho các văn bản nhãn, tôi đã sửa đổi nó để sử dụng mã thế hệ id giống như những người giúp đỡ trường mẫu.

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, string labelText) 
{ 
    // The main part of this code is taken from the internal code for Html.LabelFor<TModel, TValue>(...). 
    var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    var fieldName = ExpressionHelper.GetExpressionText(expression); 

    TagBuilder builder = new TagBuilder("label"); 
    // Generate the id as for the form fields (adds it to self). 
    builder.GenerateId(fieldName); 
    // Use the generated id for the 'for' attribute. 
    builder.Attributes.Add("for", builder.Attributes["id"]); 
    // Remove the id again. 
    builder.Attributes.Remove("id"); 
    builder.SetInnerText(labelText); 
    return MvcHtmlString.Create(builder.ToString()); 
} 

Điều này giải quyết vấn đề trước mắt của tôi, nhưng nó không trả lời câu hỏi là tại sao việc triển khai giống như trong MVC2. Nếu có lý do cho nó.

Nhân tiện: Không cần thực sự sửa đổi id/cho thuộc tính trong HTML5, vì nó hoàn toàn hợp pháp để có id giống như ^~[] nếu bạn muốn. Tất cả các trình duyệt chính đều hỗ trợ nó. Điều này được giải thích một cách độc đáo bởi Mathias Bynens.

UPDATE 2:

này không giải quyết được vấn đề gì cả trên thực tế, kể từ khi DefaultModelBinder không thể liên kết với nó anyway. Sử dụng đối tượng lồng nhau trong từ điển dường như không được hỗ trợ bởi các máy phát điện tên trường trong MVC 2, vì nó tạo ra:

<input type="text" name="Dict[en]" value="(VALUE)"> 

Thay vì những gì các model binder muốn:

<input type="hidden" name="Dict[0].Key" value="en"> 
<input type="text" name="Dict[0].Value" value="(VALUE)"> 

Lạ mà nó đi ra khỏi hộp theo cách này.

tôi đã cố gắng tạo ra một mô hình tùy chỉnh chất kết dính cho nó, nhưng tôi không thể có được MVC2 để sử dụng nó bất cứ điều gì tôi cố gắng sử dụng nó trên:

ModelBinders.Binders.Add(typeof(IDictionary<string,object>), new DictionaryModelBinder()); 
ModelBinders.Binders.Add(typeof(IDictionary<string,string>), new DictionaryModelBinder()); 
ModelBinders.Binders.Add(typeof(IDictionary), new DictionaryModelBinder()); 
ModelBinders.Binders.Add(typeof(Dictionary), new DictionaryModelBinder()); 

Vì vậy, ngay bây giờ có vẻ như nó trở lại tự tạo các giá trị thuộc tính tên với các trường bị ẩn .Key.

+0

tôi đã nhận thấy điều tương tự. mặc dù tôi không bao giờ sử dụng nhãn trong cấu trúc lặp lại. Tôi sử dụng một cái bàn. bạn có thử nó trong vòng lặp foreach không? nó trông như thế nào? – Stefanvds

+0

Tôi thực sự sử dụng nó trong vòng lặp foreach, đây là một ví dụ đơn giản với khóa rõ ràng để dễ đọc. –

Trả lời

1

MVC intentionally mungs ids with special characters which are significant in jQuery/CSS3 selectors. Điều này là do cú pháp chọn trở nên phức tạp khi có các ký tự "dành riêng" (bởi jQuery/CSS3) trong ID.

Nó không không làm điều này với name vì không cần thiết ở đó và bị ràng buộc.

Đó chắc chắn là lỗi nếu LabelFor không thực sự trỏ đến TextBoxFor tương ứng. Nhưng tôi cho rằng lỗi là trong LabelFor, không phải trong TextBoxFor.

3

Đây là lỗi trong MVC3 mà chúng tôi đang lên kế hoạch sửa lỗi cho bản phát hành tiếp theo (MVC 3 RTM). LabelFor sẽ đi qua trình tạo thẻ để tạo thuộc tính 'for' bằng cách sử dụng cùng một logic được sử dụng để tạo id để chúng sẽ xếp hàng cho các mảng và các loại lồng nhau.

Hiện tại, chúng tôi đang sử dụng thông số kỹ thuật html 4.01 để tạo id để bạn không thể sử dụng id bắt đầu bằng chữ cái không phải chữ cái. Chúng tôi sẽ suy nghĩ về cách tiếp cận tốt nhất hiện nay là các tiêu chuẩn đã thay đổi.

+0

Vui mừng khi thấy điều này nằm trong danh sách những điều cần sửa. Tôi đã dành nửa giờ để googling điều này mà không có rất nhiều thành công. Rất bực bội. –