2009-06-07 4 views

ответ

3

Предполагая, что 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 параметров для каждого из «непроверенных» флажков перед отправкой, и это устранит необходимость заполнения исходного словаря, так как вы сможете напрямую выводить значения для всех элементов словаря.

+0

Так далеко я тоже знаю. Теперь мне нужно передать эти данные (с измененными значениями bool) обратно на контроллер. Подходит ли ваш подход к этому, и я просто делаю что-то неправильно или не включает эту часть? –

+0

Я вижу. Я обновляю свой ответ с помощью одной идеи. – tvanfosson

+0

И вот в чем вопрос - как заставить привязать модель к работе. Извините за мою неопределенность. –