我正在使用此处找到的指南 http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style并且正在使用 MVC2。
我已经让它与这样的 Controller 方法一起工作:
[HttpPost]
public ActionResult CreateStockRequest(StockRequestModel viewModel, List<StockRequestModel.StockRequestItem> items)
{
viewModel.Items = items;
// Validate the request and submit it
return View(viewModel);
}
如您所见,即使我的模型包含一个 Items
方法,我也必须添加一个 items
参数,因为模型上的属性不是越来越多。
我已经尝试在 BeginCollectionItem
方法中将 items
更改为 Items
并尝试了各种其他值,但我无法获取它无需在 Controller 方法中添加单独的 items
参数即可工作。
tl;dr:如何从 View 中添加/删除/编辑模型的列表属性中的项目?
查看
<table>
<thead>
<tr>
<td><%= Html.LabelFor(m => m.Items[0].Item )%></td>
<td><%= Html.LabelFor(m => m.Items[0].Quantity )%></td>
</tr>
</thead>
<tbody id="editorRows">
<% foreach (var item in Model.Items)
{
Html.RenderPartial("StockRequestItemEditor", item);
}%>
</tbody>
<tfoot>
<tr><td colspan="2"> </td></tr>
<tr>
<td colspan="2"><%= Html.ActionLink("Add Item...", "BlankEditorRow", null, new { id = "addItem" })%></td>
<script type="text/javascript">
$("#addItem").click(function() {
$.ajax({
url: this.href,
cache: false,
success: function(html) { $("#editorRows").append(html); }
});
return false;
});
</script>
</tr>
</tfoot>
</table>
局部 View
<tr>
<% using(Html.BeginCollectionItem("Items")) { %>
<td>
<%= Html.ComboBoxFor(m => m.Item,
null,
Url.Action("Products", "Data", new { area = (string)null }),
Model.Item,
2)%>
</td>
<td><%= Html.TextBoxFor(m => m.Quantity)%></td>
<% } %>
</tr>
最佳答案
这是一个远景,但也许这就是问题所在:
Html.RenderPartial("StockRequestItemEditor", item);
我在 POST 操作中检查 viewModel 时注意到它在集合中具有正确数量的项目,但它们都为空。这向我表明这是模型 Binder 的前缀问题。所以也许这样的事情会奏效:
var dictPrefix = new ViewDataDictionary();
dictPrefix.TemplateInfo.HtmlFieldPrefix = "SomePrefix";
Html.RenderPartial("StockRequestItemEditor", item, dictPrefix);
我不认为 RenderPartial()
在不使用此重载的情况下传递前缀(尽管可能是错误的)。我不完全确定 bind 前缀是如何工作的,所以我实际上不知道名称是什么,但它似乎与这里相关。该集合中的项目数量肯定对我来说是正确的,但没有一个是正确装订的。
希望这足以促使其他人给您正确的答案。
关于c# - 从列表中添加/删除项目作为 View 中模型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11884150/