2013-11-10 2 views
0

На странице редактирования массовой формы я показываю около 50 объектов, которые также имеют некоторые логические свойства. Контроллер получает FormCollection со всеми значениями на странице редактирования.MVC checkboxes & FormCollection

public void _EditAll(FormCollection c) 
    { 
     int i = 0; 
     if (ModelState.IsValid) 
     { 
      var arrId = c.GetValues("channel.ID"); 
      var arrName = c.GetValues("channel.displayedName"); 
      var arrCheckbox = c.GetValues("channel.isActive"); 

      for (i = 0; i < arrId.Count(); i++) 
      { 
       Channel chan = db.Channels.Find(Convert.ToInt32(arrId[i])); 
       chan.displayedName = arrName[i]; 
       chan.isActive = Convert.ToBoolean(arrCheckbox[i]); 
       db.Entry(chan).State = EntityState.Modified; 
      } 
      db.SaveChanges(); 
     } 
    } 

Теперь для флажков, MVC создает скрытые входы на форме (в противном случае «ложь» не может быть вывешены назад). В контроллере, при получении FormCollection, это приводит к случаю, когда я получаю массив сказать

  • 50 идентификаторов,
  • 50 имен и ..
  • 71 или около этого значения для флажков,

поскольку скрытый флажок имеет то же имя, что и видимое.

Что такое хороший способ справиться с этим и получить правильное значение этого флажка?

+0

Разве вы не хотите использовать свою собственную модель обзора, с которой будут привязаны значения флажков? – LINQ2Vodka

+0

Вы думаете, что позаботится о флажке-thingie? Хм, я попробую. – peter

+0

Не удалось получить эту работу (передать список моих объектов с их правильным состоянием из формы в контроллер). Получил, что работает только в том случае, если будет отправлено только одно лицо. – peter

ответ

1

образца для редактирования массива объектов, которые имеют логическое поле.

Entity:

public class Entity 
{ 
    public int Id { get; set; } 
    public bool State { get; set; } 
} 

Контроллер:

public ActionResult Index() 
{ 
    Entity[] model = new Entity[] 
     { 
      new Entity() {Id = 1, State = true}, 
      new Entity() {Id = 2, State = false}, 
      new Entity() {Id = 3, State = true} 
     }; 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(Entity[] entities) 
{ 
    // here you can see populated model 
    throw new NotImplementedException(); 
} 

Вид:

@model Entity[] 
@{ 
    using (Html.BeginForm()) 
    { 
     for (int i = 0; i < Model.Count(); i++) 
     { 
      @Html.Hidden("entities[" + i + "].Id", Model[i].Id) 
      @Html.CheckBox("entities[" + i + "].State", Model[i].State) 
     } 
     <input type="submit"/> 
    } 
} 

Единственная сложная вещь HTML элементы именования.
More info о привязке массивов.

+0

Большое спасибо за усилие и ссылку, попробую еще раз! – peter

+0

@peter Примите ответ, как только он сработает :) спасибо – LINQ2Vodka

0

Я конвертирование всех массивов, содержащие флажок стоимости:

«ложь» => «ложь», если не предшествует «истинный»

Смежные вопросы