当我尝试发布数据并从具有局部视图的视图调用动作时,我没有获得部分视图的模型数据,但是当我直接使用它而不是部分视图时,它会正确地发送数据。
<div id="mydiv">
@using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" }))
{
//Does not send data to action on post
@Html.Partial("ViewUserControl1",Model.Emps)
//ViewUserControl1 contains the same next 8 line logic.
OR
//Send the data to actions on post.
for (int i = 0; i < Model.Emps.Count(); i++)
{
@Html.TextBoxFor(x => x.Emps[i].Name)
@Html.TextBoxFor(x => x.Emps[i].Address)
@Html.ValidationMessageFor(x => x.Emps[i].BBString)
<br />
}
<input id="dosomething" type="submit" value="save" />
}
</div>
///On Controller
[HttpPost]
public ActionResult Index1(MyModel model)
{
///Here i am looking for the model data which is null for partial.
return View(model);
}
MyModel有一个Emps列表{Name,Address}
有没有人知道这个的原因。
答案 0 :(得分:2)
我怀疑你的ViewUserControl1
部分是这样的(你没有显示它,你只是说它看起来像下面的8行,但显然它看起来不是那8行因为它使用了不同的视图模型):
@model IEnumerable<Employee>
for (int i = 0; i < Model.Count(); i++)
{
@Html.TextBoxFor(x => x[i].Name)
@Html.TextBoxFor(x => x[i].Address)
@Html.ValidationMessageFor(x => x[i].BBString)
<br />
}
注意lambdas中缺少Emps
属性?这会为输入字段生成无效名称,并且默认模型绑定器在您回发时不会获取值。
我建议您使用编辑器模板而不是部分视图,如下所示:
<div id="mydiv">
@using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "mydiv", InsertionMode = InsertionMode.Replace, HttpMethod = "Post" }))
{
@Html.EditorFor(x => x.Emps)
<input id="dosomething" type="submit" value="save" />
}
</div>
然后只在~/Views/SomeControllerName/EditorTemplates/Employee.cshtml
内:
@model Employee
@Html.TextBoxFor(x => x.Name)
@Html.TextBoxFor(x => x.Address)
@Html.ValidationMessageFor(x => x.BBString)
<br/>
将为Emps
集合的每个元素呈现编辑器模板,这样您就不需要编写任何循环。它将为输入字段生成专有名称,以便默认模型绑定器能够在回发时填充值。编辑器模板位置很重要。它必须放在~/Views/Shared/EditorTemplates
内(如果您希望在多个控制器之间重用)或~/Views/SomeControllerName/EditorTemplates
内(如果您希望它只在给定控制器的视图之间重用)。模板的名称也很重要。它应该被称为与集合的类型相同。因此,例如,如果视图模型中有属性public IEnumerable<Employee> Emps { get; set; }
,则必须将模板调用Employee.cshtml
,以便为此集合的每个元素自动呈现它。
答案 1 :(得分:0)