正在尝试使用Html.BeginCollectionItem在我的应用程序中工作,并且很难获得要发布的数据。我想将项目添加到列表中,然后发布整个列表。我正在使用ajax和jquery向我的列表中添加和删除项目,这似乎是可行的。但是当我发布在我的控制器中收到的模型总是空的,即使当我看到fiddler时,表单数据包含了我的所有信息。
有人在我的代码中看到我做错了什么简单的事情吗?
主要观点:
@model Test.Models.TestList
@using (Html.BeginForm())
{
<div class="form-group">
<div class="row">
<label for="AssemblyText" class="col-sm-1 col-sm-offset-1 control-label">Assembly:</label>
<div class="col-sm-2">
<input type="text" id="assembly" />
</div>
<label for="QuantityText" class="col-sm-1 control-label">Quantity:</label>
<div class="col-sm-2">
<input type="text" id="Qty" />
</div>
<button type="button" id="AddAssembly">Add Button</button>
</div>
</div>
<table id="Assemblies" class="table table-striped">
<thead>
<tr>
<th>Assembly</th>
<th>Quantity</th>
<th>Action</th>
</tr>
</thead>
<tbody class="text-left">
@if (Model != null)
{
foreach (var assembly in Model.mylist)
{
@Html.Partial("AssemblyRow", assembly)
}
}
</tbody>
</table>
<div class="form-group">
<input type="submit" id="submitbtn" class="btn btn-success" value="Submit" />
</div>
}部分视图(AssemblyRow)
@model Test.Models.Test
<tr class="editorRow">
@using (Html.BeginCollectionItem("Assembly"))
{
<td>
@Html.HiddenFor(m => m.assembly)
@Html.TextBoxFor(m => m.assembly)
</td>
<td>
@Html.HiddenFor(m => m.Qty)
@Html.TextBoxFor(m => m.Qty)
</td>
<td>
<span class="dltBtn">
<a href="#" class="deleteRow">Delete</a>
</span>
</td>
}
我的模特很简单,看上去.
public class TestList
{
public List<Test> mylist { get; set; }
}
public class Test
{
public string assembly { get; set; }
public string Qty { get; set; }
}我的控制器
[HttpPost]
public ActionResult PostMain(TestList model)
{
return View();
}我可以提供你们认为有帮助的任何其他代码,但是我试着用我认为相关的代码来保持简单。
谢谢你的帮助!
编辑:小提琴图片

发布于 2016-10-06 21:33:00
集合属性名为mylist,因此必须将该名称传递给BeginCollectionItem方法。
@using (Html.BeginCollectionItem("mylist"))
{
....它将生成需要正确绑定到模型的name=mylist[xxxx].assembly"元素(其中xxxx是Guid)。
但是,您的代码还有其他问题。DefaultModelBinder绑定匹配模型属性的第一个名称/值对,并忽略同名的任何后续名称/值对。因为在textbox之前,每个属性都有一个隐藏的输入,所以只有发送到视图的初始值在提交时才会被绑定,而不是经过编辑的值。您需要移除部分为
@model Test.Models.Test
<tr class="editorRow">
@using (Html.BeginCollectionItem("mylist"))
{
<td>@Html.TextBoxFor(m => m.assembly)</td>
<td>@Html.TextBoxFor(m => m.Qty)</td>
<td>
<span class="dltBtn"><a href="#" class="deleteRow">Delete</a></span>
</td>
}
</tr>附带注意:也不清楚初始<div class="form-group">中的html是干什么用的。包含两个输入和一个按钮,但这不会绑定到模型,也不会正确地将项添加到集合中(添加按钮需要使用ajax调用服务器方法,该方法返回另一个部分视图并将其附加到DOM中)
发布于 2016-10-06 16:06:35
我没有看到提交按钮,所以不能真正告诉您要提交什么,但是尝试将ActionResult PostMain(TestList model)更改为:
ActionResult PostMain(List<Test> model)发布于 2016-10-06 16:36:36
您需要使用编辑器模板而不是部分视图。主控制器上下文在部分视图中不可用。Stackoverflow上有这么多关于这个问题的文章。其中之一是ASP.NET MVC 3 - Partial vs Display Template vs Editor Template
https://stackoverflow.com/questions/39900341
复制相似问题