2014-09-04 4 views
0

Я пытаюсь обновить значение флажка из базы данных .Доступ к значению флажков с контроллера - DB

В представлении перечислены все доступные рабочие в БД. , но когда я пытаюсь получить доступ к списку флажков, представление передает неправильные данные ex. есть только 3 флажка, и он отправляет 5 элементов истинного/ложного значения.

Я очень ценю любую помощь.

View Sample Code

@using (Html.BeginForm("UpdateWorkersForTask", "Tasks", FormMethod.Post)) 
{ 
<table> 
    <tr> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.isChecked) 
       @Html.CheckBox("WorkersID", item.isChecked) 

     </tr> 
    } 

и контроллер является

[HttpPost] 
public ActionResult UpdateWorkersForTask(IEnumerable<bool> WorkersID, IEnumerable<string> hiddens) { } 

ответ

1

Поскольку дизайн @Html.CheckBox и @Html.CheckBoxFor делают 2 входа, флажок и скрытый ввод. Если вы осмотрите HTML вы увидите что-то вроде

<input name="WorkersID" type="checkbox" value="true"> 
<input name="WorkersID" type="hidden" value="false"> 

Причина этого заключается в том, что непроверенные флажки не отправляют обратно. поэтому второй вход гарантирует, что значение будет отправлено обратно. В случае, когда флажок установлен, DefaultModelBinder считывает первое значение, которое является истинным, и игнорирует второе значение (поскольку оно имеет то же имя).

В вашем случае вы не являетесь обязательным для вас моделью, вместо этого вы просто читаете все входы с именем WorkersID. Если у вас есть 3 элемента, но 5 значений отправлены назад, это будет означать, что вы проверили 2 из ящиков.

Чтобы это исправить, изменить свой вид и способ действия следующим образом (обратите внимание, ваша модель должна быть IList поэтому цикл работы for, или в качестве альтернативы вы можете использовать собственный EditorTemplate

Посмотреть

for(int i = 0; i < Model.Count i++) 
{ 
    @Html.CheckBoxFor(m => m[i].WorkersID) 
} 

Контроллер

[HttpPost] 
ActionResult UpdateWorkersForTask(IEnumerable<YourModelType> model) 
{ 
    foreach(YourModelType item in model) 
    { 
    // do something with the value of item.WorkersID 
+0

Большое спасибо Mr.Stephen –

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