MVC中的Ajax.BeginForm使用不同模型的部分视图?

时间:2015-03-03 21:38:02

标签: c# ajax asp.net-mvc asp.net-mvc-4

问题:

我正在尝试利用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对象中的一个属性,它被发送到我的控制器。这可能吗?

2 个答案:

答案 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>

谢谢!