2011-03-04 72 views
47

Tôi đang cố gắng ràng buộc các giá trị từ điển trong MVC.ASP.NET MVC Binding vào một từ điển

Trong hành động Tôi có:

model.Params = new Dictionary<string, string>(); 

model.Params.Add("Value1", "1"); 
model.Params.Add("Value2", "2"); 
model.Params.Add("Value3", "3"); 

và trong tầm nhìn tôi có:

@foreach (KeyValuePair<string, string> kvp in Model.Params) 
{ 
<tr> 
    <td> 
    <input type="hidden" name="Params.Key" value="@kvp.Key" /> 
    @Html.TextBox("Params[" + kvp.Key + "]") 
    </td> 
</tr> 
} 

Nhưng quan điểm không hiển thị các giá trị ban đầu, và khi biểu mẫu được gửi các Params tài sản là null?

Trả lời

49

bạn nên có một cái nhìn bài này từ Scott Hanselman: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx

Các chất kết dính mặc định chỉ hiểu từ điển trong các định dạng:

params[0].key = kvp.key 
params[0].value = kvp.value 

Chỉ số của param phải tuần tự, bắt đầu từ 0 và không có khoảng trống nào. Những người trợ giúp hiện tại không hỗ trợ điều này, vì vậy bạn nên tự tạo các trường nhập biểu mẫu.

nhiên bạn có thể thực hiện chất kết dính của riêng bạn, như thế này: http://siphon9.net/loune/2009/12/a-intuitive-dictionary-model-binder-for-asp-net-mvc/

73

Trong ASP.NET MVC 4, mô hình mặc định binder sẽ ràng buộc từ điển bằng cách sử dụng từ điển điển hình indexer cú pháp property[key].

Nếu bạn có một Dictionary<string, string> trong mô hình của bạn, bây giờ bạn có thể liên kết lại để nó trực tiếp với các đánh dấu sau:

<input type="hidden" name="MyDictionary[MyKey]" value="MyValue" /> 

Ví dụ, nếu bạn muốn sử dụng một tập hợp các hộp kiểm để chọn một tập hợp con của các yếu tố của một từ điển và ràng buộc về tài sản tương tự, bạn có thể làm như sau:

@foreach(var kvp in Model.MyDictionary) 
{ 
    <input type="checkbox" name="@("MyDictionary[" + kvp.Key + "]")" 
     value="@kvp.Value" /> 
} 
+0

Cảm ơn cho điều này, khá một cách tốt đẹp để ràng buộc. – valentin

+1

Và một ngày tốt lành với bạn! – kingdango

+5

Ai đó có thể cung cấp bất kỳ liên kết nào đến câu trả lời chi tiết hơn không? Đã cố gắng cho từ điển và nó không hoạt động, vì vậy tôi đã phải đi với cú pháp indexer cũ. –

13

Xây dựng về câu trả lời @ AntP của, có một cách thậm chí còn ít tiết, cho phép MVC làm nhiều công việc (ít nhất với TextBoxFor() trên Dictionary<string, string> - Tôi đã không cố gắng CheckBoxFor() trên Dictionary<xxx, bool>):

@foreach(var kvp in Model.MyDictionary) 
{ 
    @Html.Label(kvp.Key); 
    @Html.TextBoxFor(m => m.MyDictionary[kvp.Key]); 
} 
+1

'CheckBoxFor' sẽ hoạt động với chuỗi' Dict <, bool> 'nhưng nó sẽ không hoạt động trong bất kỳ kịch bản nào mà bạn muốn ràng buộc lại các cặp khóa/giá trị cụ thể trong đó giá trị không chỉ là bool - cần tự xây dựng đánh dấu (như trong ví dụ của tôi). –

+0

Tại sao điều này chỉ làm việc cho các boolean? Tôi đã nhận được điều này để làm việc cho Dict là tốt, và tôi không thấy lý do tại sao nó không nên làm việc cho các loại dữ liệu khác. –

+0

@KaiWeber - Điều này có thể hoạt động cho bất kỳ 'Từ điển '(trong thực tế,' 'là những gì tôi sử dụng trong câu trả lời của tôi). Tuy nhiên, tôi đã không thử nghiệm nó với bất cứ điều gì khác.Những gì tôi nghĩ rằng Ant P nói rằng nó chỉ hoạt động cho các từ điển đã nhập ('Dictionary <>'), và không phải các bộ sưu tập không chung chung như [IDictionary] (https://msdn.microsoft.com/en-us/library/system .collections.idictionary.aspx) – Sphinxxx

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