问题:
我正在尝试利用AjaxExtension BeginForm来提交表单数据。我注意到的问题是,由于MVC处理模型绑定的方式,我的模型中的复杂对象及其所有属性都在AJAX帖子上丢失。我似乎无法找到解决这个问题的方法,同时在各种视图之间保持我需要的分离。我确实看了Passing two models to Controller using Ajax BeginForm(),但解决方案并不适用于我的问题,因为视图没有分成依赖于不同模型的部分内容。
这就是我的代码看起来的样子(至少是它的本质 - 更改名称):
A.cshtml
@model A
<div>
@using (Ajax.BeginForm("ActionA", "ControllerA", new { id = Model.Id }, new AjaxOptions { HttpMethod = "POST" }, new { id = "formId" }))
{
@Html.Partial("ModelForm", Model.B)
}
</div>
B.cshtml
@model B
...
<div>
<p>@Html.TextBoxFor(x => x.Prop1)</p>
</div>
<div>
@Html.EditorFor(x => x.ComplexObject1)
</div>
<div class="spacing">
<p>@Html.TextBoxFor(x => x.Prop2)</p>
</div>
<div class="spacing">
@Html.EditorFor(x => x.ComplexObject2)
</div>
...
A.cs
...
public B B { get; set;}
...
ControllerA.cs
...
public ActionResult ActionA(A model) {
//do something with model
}
...
当我在控制器的ActionResult中放置断点时,模型对象被实例化,但B属性为null。如果我添加一个@ Html.HiddenFor(x =&gt; x.B.Prop1)并运行相同的代码,我看到B不是null,但我为Prop1分配的属性丢失了。此外,如果我将Prop1添加到 A.cs 并运行相同的代码,我注意到我所期望的B的Prop1被分配给A的Prop1(这有助于我理解绑定是如何工作的)。我基本上希望表单能够识别出在B.cshtml中,所有的Html助手都填写了B对象,这是A对象中的一个属性,它被发送到我的控制器。这可能吗?
答案 0 :(得分:1)
正如Stephen Muecke所指出的那样,HtmlFieldPrefix就是这个问题的解决方案。
答案 1 :(得分:0)
您的模型A具有模型B的引用属性。因此,您可以轻松地将模型B中的属性用于与模型A绑定的视图。您可以尝试这样:
@model A
<div>
@using (Ajax.BeginForm("ActionA", "ControllerA", new { id = Model.Id }, new AjaxOptions { HttpMethod = "POST" }, new { id = "formId" }))
{
// @Html.Partial("ModelForm", Model.B)
<div>
<p>@Html.TextBoxFor(x => x.B.Prop1)</p>
</div>
<div>
@Html.EditorFor(x => x.B.ComplexObject1)
</div>
<div class="spacing">
<p>@Html.TextBoxFor(x => x.B.Prop2)</p>
</div>
<div class="spacing">
@Html.EditorFor(x => x.B.ComplexObject2)
</div>
}
</div>
谢谢!