繁体   English   中英

在MVC中使用Ajax.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM