2015-12-22 1 views
-1

Создание формы, которая позволяет пользователю добавлять бесконечные строки. Это делается с помощью ajax-вызова для контроллера, который добавляет частичный вид (один раз за клик).MVC form Сообщение null на контроллере

Я использую Html.BeginCollectionItem для индексации каждого ввода в частичных представлениях.

Я могу добавить кучу предметов и нажать кнопку «Отправить», я вижу, что форма отправлена ​​в скрипач, но контроллер показывает нулевую форму. Если я изменил тип постконтроллера из списка <> на особый AccessoryVM, я получу первый элемент.

Я попытался изменить тип модели в виде индекса из списка в IEnumerable, без изменений.

индекс:

@model List<EmployeeHardwareRequest.Models.ViewModels.AccessoryVM> 

@{ 
    ViewBag.Title = "Select Accessories"; 
} 

<h2>Accessories</h2> 


    @using (Html.BeginForm("Index", "Accessory", FormMethod.Post, new { @class = "form-horizontal" })) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div id="form-body"> 
      @foreach (var item in Model) 
      { 
       @Html.Partial("_NewItem") 
      } 
     </div> 

     <div class="row"> 
      <div class="col-md-6"> 
       <button id="add-item" class="btn btn-primary">Add Another Item</button> 
      </div> 
      <div class="col-md-6"> 
       <input type="submit" value="Select Software" class="btn btn-default pull-right" /> 
      </div> 
     </div> 
    } 

Частичное:

@model EmployeeHardwareRequest.Models.ViewModels.AccessoryVM 

<div class="form-group col-md-3"> 
    <div> 
     @Html.DropDownListFor(model => model.SelectedAccessory, Model.AccessoryDdl, new { @class = "form-control accessoryList" }) 
    </div> 
</div> 

<div class="form-group col-md-8"> 
    <div> 
     @using (Html.BeginCollectionItem("AccessoryVM")) 
     { 
      @Html.EditorFor(model => model.ProductLink, new { htmlAttributes = new { @class = "form-control", @placeholder = "Enter link to web page" } }) 
      @Html.ValidationMessageFor(model => model.ProductLink, "", new { @class = "text-danger" }) 
     } 
    </div> 
</div> 
<div class="col-md-1"> 
    <button type="button" id="deleteItem" class="btn btn-danger"> 
     <span class="glyphicon glyphicon-remove"></span> 
    </button> 
</div> 

Контроллеры: индекс: общественный индекс ActionResult() { Список modelList = новый список();

 List<Accessory> accessories = _db.Accessory.ToList(); // change this to use the accessoryDTO 

     List<int> monitorSizeList = new List<int> // replace this with data from db table. 
     { 
      20, 22, 24, 27 
     }; 

     model.AccessoryDdl = new SelectList(accessories, "AccessoryId", "ItemDescription", selectedAcc); 
     model.MonitorSizeDdl = new SelectList(monitorSizeList); 
     return View(modelList); 
    } 

Получить частичный вид:

public ActionResult AddItem(int index) 
    { 
     AccessoryVM model = new AccessoryVM(); 
     int selectedAcc = 1; 

     List<Accessory> accessories = _db.Accessory.ToList(); // change this to use the accessoryDTO 

     List<int> monitorSizeList = new List<int> // replace this with data from db table. 
     { 
      20, 22, 24, 27 
     }; 

     //model.lineIndex = index++; 

     model.AccessoryDdl = new SelectList(accessories, "AccessoryId", "ItemDescription", selectedAcc); 
     model.MonitorSizeDdl = new SelectList(monitorSizeList, "Select Monitor Size"); 
     return PartialView("_NewItem", model); 
    } 

сообщение:

[HttpPost] 
    public ActionResult Index(List<AccessoryVM> form) 
    { 

Я проверил для двойного использования ключевых слов и свойств, но не видят каких-либо конфликтов.

+0

В основном, проблема заключается в том, что при представить вы отправляете список который excepts связывающего названия модели, как [0]. SelectedAccessory, [0] .ProductLink, [1] .SelectedAccessory, [1] .ProductLink ....................... Однако частичный вид генерирует одно и то же имя SelectedAccessory и ProductLink для каждой строки. Это нарушает привязку модели. Чтобы исправить это, вы можете создать список в js, чтобы выталкивать данные из каждой строки и отправлять их на сервер или генерировать имя управления входом в частичном представлении, как требуется для привязки к модели. – user1672994

ответ

0

Вы можете использовать это в вашей почтовой функции

[HttpPost] 
public ActionResult Index(List<AccessoryVM> form) 
{ 
    foreach (var AccessoryVM in model.AccessoryVMs) 
    { 
     //do stuff with each of these here .. 
    } 
    } 

С уважением Jasbeer Сингх

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

  • Нет связанных вопросов^_^