2011-06-17 74 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