Предполагая, что MyType имеет строковое свойство с именем Name
, из которого вы получите имя флажка. Обратите внимание, что я изменил это, чтобы предвосхитить его с MyType
, чтобы мы могли легко различить его на сервере. Вам может не понадобиться этот шаг, если у вас есть другой способ определить, какие поля являются флажками.
<% foreach (var pair in model.ChecboxDictionary) { %>
<%= Html.CheckBox( "MyType." + pair.Key.Name, pair.Value ) %>
<% } %>
Контроллер (здесь используются FormParameters, но вы также можете попробовать связать модель с префиксом «MyType» непосредственно к Dictionary<string,bool>
, а затем перевести.
public ActionResult MyAction( FormParameters form )
{
var dict = ... fill dictionary with original values...
foreach (var key in dict.Keys)
{
if (!form.Keys.Contains( "MyType." + key.Name ))
{
dict[key] = false;
}
}
foreach (var key in form.Keys.Where( k => k.StartsWith("MyType.")))
{
var value = form[key].Contains("on"); // just to be safe
// create or retrieve the MyType object that goes with the key
var myType = dict.Keys.Where( k => k.Name == key ).Single();
dict[myType] = value;
}
...
}
Вы также можете, с небольшим количеством javascript на стороне клиента, добавить name=off
параметры для каждого из «непроверенных» флажков перед отправкой, что избавит от необходимости заполнять исходный словарь, так как вы сможете непосредственно выводить значения для всех элементов словаря.