【发布时间】:2015-12-22 23:20:37
【问题描述】:
构建一个允许用户添加无限行的表单。这是通过 ajax 调用添加部分视图的控制器来完成的(每次点击一次)。
我正在使用 Html.BeginCollectionItem 来索引局部视图中的每个输入。
我可以添加一堆项目并单击提交,我可以看到表单在提琴手中发布,但控制器显示一个空表单。如果我将后控制器类型从 List 更改为单数 AccessoryVM,我会得到第一项。
我尝试将 Index 视图中的模型类型从 List 换成 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>
控制器: 指数: 公共行动结果索引() { 列表 modelList = new List();
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)
{
我检查了关键字和属性的双重使用,但没有发现任何冲突。
【问题讨论】:
-
基本上,问题是在提交时您提交 List
模型绑定名称为 [0].SelectedAccessory, [0].ProductLink, [1].SelectedAccessory, [1 ].ProductLink....................... 但是,局部视图会为每一行生成相同的名称 SelectedAccessory 和 ProductLink。这会破坏模型绑定。要修复它,您可以在 js 中创建一个列表以从每一行推送数据并将其发布到服务器,或者根据模型绑定的需要在局部视图中生成输入控件名称。
标签: asp.net-mvc asp.net-mvc-partialview