Создание формы, которая позволяет пользователю добавлять бесконечные строки. Это делается с помощью 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)
{
Я проверил для двойного использования ключевых слов и свойств, но не видят каких-либо конфликтов.
В основном, проблема заключается в том, что при представить вы отправляете список который excepts связывающего названия модели, как [0]. SelectedAccessory, [0] .ProductLink, [1] .SelectedAccessory, [1] .ProductLink ....................... Однако частичный вид генерирует одно и то же имя SelectedAccessory и ProductLink для каждой строки. Это нарушает привязку модели. Чтобы исправить это, вы можете создать список в js, чтобы выталкивать данные из каждой строки и отправлять их на сервер или генерировать имя управления входом в частичном представлении, как требуется для привязки к модели. –
user1672994