[英]Asp.Net MVC and Partial Views and Mixing Ajax.BeginForm and Html.BeginForm
[英]Ajax.BeginForm in MVC using partial views with different models?
问题:
我正在尝试利用AjaxExtension BeginForm来提交表单数据。 我注意到的问题是,由于MVC处理模型绑定的方式,模型中的复杂对象及其所有属性都在AJAX帖子上丢失了。 我似乎无法找到一种方法来解决这个问题,同时又保持各种视图之间所需的分隔。 我确实看过使用Ajax BeginForm()将两个模型传递给Controller的方法,但是该解决方案不适用于我的问题,因为视图没有拆分成依赖于不同模型的局部视图。
这是我的代码的样子(至少本质上是-更改名称):
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 => xBProp1)并运行相同的代码,我会看到B不为空,但是我为Prop1分配的属性会丢失。 另外,如果我将Prop1添加到A.cs并运行相同的代码,我会注意到将B的Prop1分配给A的Prop1(这有助于我理解绑定的工作原理)。 我基本上希望表单能够识别出,在B.cshtml中,所有Html帮助器都在填充B对象,该对象是A对象中的一个属性,该属性被发送到我的控制器。 这可能吗?
正如Stephen Muecke指出的那样,HtmlFieldPrefix看起来就是解决此问题的方法。
您的模型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>
谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.