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
.
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
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. –