MVC3 - 从RenderPartial传回模型

Jus*_*per 4 razor asp.net-mvc-3

我在MVC3中有一个页面,其模型为"pageModel".

在这个页面我有:

@{ Html.RenderPartial("_subPage", Model.subModel); } (Pagemodel.submodel)
Run Code Online (Sandbox Code Playgroud)

在我的控制器中我正在做:

 [Authorize]
 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Results(pagemodel model, string frmAction)
 {
 }
Run Code Online (Sandbox Code Playgroud)

页面第一次加载正常,但是当我回发到httpPost动作时,model.submodel总是为空.

我的问题是,如何从RenderPartial返回更新的模型(如果有的话).我可以让我的模型INTO部分,但不能回来!

Dar*_*rov 12

部分问题是它们不保留导航上下文.这意味着您可能放在此部分中的任何输入字段都将具有不正确的名称,并且默认模型绑定程序将无法在POST时检索值.您的HTML将如下所示:

<input type="text" name="Prop1" value="property 1 value" />
<input type="text" name="Prop2" value="property 2 value" />
Run Code Online (Sandbox Code Playgroud)

而正确的是:

<input type="text" name="subModel.Prop1" value="property 1 value" />
<input type="text" name="subModel.Prop2" value="property 2 value" />
Run Code Online (Sandbox Code Playgroud)

为了实现这个正确的标记,我建议你使用编辑器模板.

所以你替换:

@{ Html.RenderPartial("_subPage", Model.subModel); }
Run Code Online (Sandbox Code Playgroud)

有:

@Html.EditorFor(x => x.subModel)
Run Code Online (Sandbox Code Playgroud)

然后你移动你的_subPage.cshtml部分到~/Views/Shared/EditorTemplates/SubModelType.cshtml这里SubModelType是类型subModel属性:

@model SubModelType
@Html.EditorFor(x => x.Prop1)
@Html.EditorFor(x => x.Prop2)
Run Code Online (Sandbox Code Playgroud)

现在,当您查看生成的HTML时,相应的输入字段名称应该以subModelPOST控制器操作为前缀,此时model.subModel属性将被正确初始化并从用户在输入字段中输入的值中填充.