2011-06-17 140 views
0

我正在渲染一个具有控制器中的HttpPost动作的提交按钮的部分视图。此操作方法需要父模型作为其参数。有没有办法从部分视图中将父模型作为第一个参数发送?如何从内部局部视图传递父模型

主视图 - >的aspx具有模型ParentModel文件

局部视图 - > MyActionName(ParentModel模型,INT方向,INT用户 - 其具有模型作为ParentModel.ChildModel

控制器动作> ASCX文件)

如果我将方法保留为HttpPost,那么默认情况下,父模型会通过,但不能发送第二个和第三个参数,因为它们的值是在运行时决定的,并且这些参数不是子模型属性。例如指示用户是否点击了下一个/上一个按钮的方向参数。在这种情况下,next和prev按钮调用相同的动作方法(MultipleAction提交)

附加信息:我的父模型有一个子模型的集合。我正在循环访问这个集合,并为每个项目调用RenderPartial。所以,我无法直接将此父模型传递给我的部分视图(这是默认行为)。
有什么建议吗?谢谢..

回答

1

你可以包装所有这些谐音成HTML <form>,因此所有值获得提交过的服务器时,这种形式发布:

<% using (Html.BeginForm()) { %> 

    <%= Html.TextBoxFor(x => x.SomePropertyOfParent) %> 
    <%= Html.TextBoxFor(x => x.SomeOtherPropertyOfParent) %> 

    <%= Html.EditorFor(x => x.Children) %> 

    <input type="submit" value="OK" /> 
<% } %> 

我使用编辑器模板,而不是泛音的Children采集。自定义编辑器模板将自动呈现该子集合的每个元素,并提供允许修改它的任何输入字段。

然后,当表单最终提交时,模型联编程序需要重建ParentModel所需的所有属性将发送到服务器。就方向和用户参数而言,我会让它们成为父视图模型的一部分,这样我的POST控制器动作如下所示:

[HttpPost] 
public ActionResult MyActionName(ParentViewModel model) 
{ 
    ... 
} 
+0

使用EditorTemplate是更好的选择!不需要将模型传递给远景......谢谢!你今天第二次帮我。 :) – 2011-06-17 08:17:12

+0

我用EditorFor替换了RenderPartial后,发现现在我的表单没有发布。我在aspx上使用了Multi submit,因为我在ascx上有多个post按钮。当我查看“查看源代码”时,我看到控件的名称已更改。在局部视图的情况下,它们就像model.prop [0] .subprop,并且在编辑器模板的情况下它们就像model_0_subpro_等。我是否需要执行任何其他设置以使其与编辑器模板一起使用? – 2011-06-17 09:30:31

+0

@Anil Soman,通常如果在模板中使用助手(如TextBox),他们应该生成像'model.prop [0] .subprop'这样的输入字段的专有名称。 'model_0_subpro_'是id,而不是名称。就POST动作中的模型联编程序而言,它使用名称,因为这是发送到服务器的名称。 – 2011-06-17 09:34:34

相关问题