2015-08-21 4 views
1

У меня есть представление со таблицей, в которой отображаются мои элементы модели. Я извлек соответствующие части моего зрения:Значения флажка ASP.Net MVC от представления к методу пользовательского контроллера

@model System.Collections.Generic.IEnumerable<Provision> 

@using (Html.BeginForm("SaveAndSend", "Provision", FormMethod.Post)) 
{ 
    if (Model != null && Model.Any()) 
    { 
     <table class="table table-striped table-hover table-bordered table-condensed"> 
      <tr> 
       ... 
       // other column headers 
       ... 
       <th> 
        @Html.DisplayNameFor(model => model.IncludeProvision) 
       </th> 
       ... 
       // other column headers 
       ... 
      </tr> 
      @foreach (var item in Model) 
      { 
       <tr> 
        ... 
        // other columns 
        ... 
        <td> 
         @Html.CheckBoxFor(modelItem => item.IncludeProvision) 
        </td> 
        ... 
        // other columns 
        ... 
       </tr> 
      } 
     </table> 
     <button id="save" class="btn btn-success" type="submit">Save + Send</button> 
    } 
    ... 
} 

Это работает отлично, а значения Флажка корректно отображается в окне просмотра в зависимости от булева значения IncludeProvision поля для данного элемента модели.

Согласно ответу Эндрю Орлова, я изменил представление и контроллер и метод SaveAndSend() контроллера теперь:

[HttpPost] 
public ActionResult SaveAndSend(List<Provision> provisions) 
{ 
    if (ModelState.IsValid) 
    { 
     // perform all the save and send functions 
     _provisionHelper.SaveAndSend(provisions); 
    } 
    return RedirectToAction("Index"); 
} 

Однако, в этот момент проходила в модели объекта равна нулю.

В том числе предоставления модели объекта для полноты:

namespace 
{ 
    public partial class Provision 
    { 
     ... 
     // other fields 
     ... 
     public bool IncludeProvision { get; set; } 
    } 
} 

Моего вопрос, что это лучший способ, чтобы захватить проверенное/непроверенное значение из каждого флажка и обновить поле сеанса IncludeProvision для каждого элемента модели, когда Нажимается кнопка «SaveAndSend»?

+3

Вы просто должны иметь 'HttpPost' метод а не переадресацию JavaScript, затем отправьте свою модель, и затем вы можете поместить свои данные в сеанс и выполнить перенаправление. – mattytommo

+0

Старайтесь избегать проверки модели на нуль при просмотре. Это задача контроллера в вашем случае. –

+0

@AndrewOrlov hmm Я только что повторил предложенный вами рефакторинг кода ReSharper, полагая, что он не полностью оптимизирован для соответствия лучшим методам MVC. – illya

ответ

1

Вы не можете использовать foreach цикл для создания элементов управления формой для свойств в коллекции. Он создает дубликаты атрибутов name (в вашем случае name="item.IncludeProvision"), которые не имеют отношения к вашей модели и дублируют id атрибуты, которые являются недопустимыми html. Используйте либо for цикла (вы модель должна быть IList<Provision>

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

или создать EditorTemplate для TYPEOF Provision. В /Views/Shared/EditorTemplates/Provision.cshtml (обратите внимание на имя шаблона должен совпадать с именем типа)

@model Provision 
<tr> 
    <td>....</td> 
    <td>@Html.CheckBoxFor(m => m.IncludeProvision)<td> 
</tr> 

и в главном окне (модель может быть IEnumerable<Provision>)

<table> 
    @Html.EditorFor(m => m) 
</table> 
1

Как @mattytommo в комментариях, вы должны отправить свою модель на контроллер. Это можно сделать, установив флажок в форме. После нажатия кнопки «Сохранить и выйти» все данные с входов внутри этой формы будут сериализованы и отправлены на ваш контроллер, где вы сможете выполнять манипуляции с переменными сеанса и так далее. После этого вы можете перенаправить туда, где хотите.

Модель

public class YourModel 
{ 
    ... 
    public bool IncludeProvision { get; set; } 
    ... 
} 

Посмотреть

@model YourModel 

... 
@using (Html.BeginForm("SaveAndSend", "Test", FormMethod.Post)) 
{ 
    ... 
    @Html.CheckBoxFor(model => model.IncludeProvision) 
    ... 
    <button type="submit">Save and send</button> 
} 
... 

Контроллер

public class TestController : Controller 
{ 
    ... 
    [HttpPost] 
    public ActionResult SaveAndSend(YourModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Some magic with your data 
      return RedirectToAction(...); 
     } 

     return View(model); // As an example 
    } 
    ... 
} 
+0

Хмм моя модель в представлении имеет тип 'List ', а не 'Provision'. Обертывание таблицы в форме с помощью HttpPost для моего метода контроллера, при этом следующая подпись приводит к объекту с нулевым «обеспечением». 'public ActionResult SaveAndSend (Список ). – illya

+0

Как вы создали свою таблицу? Разделите свою модель.List с помощью foreach, чтобы создать каждый , и когда вы отправляете сообщение, вы получите модель –

+0

Ну, мы должны увидеть ваш взгляд и модель для более точного ответа. –

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