2010-10-01 57 views
0

我的網頁上有2種形式,它們都包括在母版,像這樣:mvc.net多種形式childaction

Html.RenderAction("Form1", "Controller") 

Html.RenderAction("Form2", "Controller") 

該控制器具有如下:

<ChildActionOnly()> 
Function Form1() As ActionResult 

    Return View("Form1", New ModelObject()) 

End Function 

<ChildActionOnly()> <AcceptVerbs(HttpVerbs.Post)> 
Function Form1(ByVal formCollection As FormCollection) As ActionResult 

    Return View("Form1", New ModelObject()) 

End Function 



<ChildActionOnly()> 
Function Form2() As ActionResult 

    Return View("Form2", New ModelObject()) 

End Function 

<ChildActionOnly()> <AcceptVerbs(HttpVerbs.Post)> 
Function Form2(ByVal formCollection As FormCollection) As ActionResult 

    Return View("Form2", New ModelObject()) 

End Function 

ascx中的表格標記如下,它們本質上是相同的形式,因此標記非常相似:

<% Using Html.BeginForm()%> 
<%= Html.TextBoxFor(Function(model) model.Property1, New With {.class = "input"})%> 
<input type="submit" class="submitbutton" value="" name="submit" /> 
<% End Using%> 

問題是,當我提交任一表單時,它將運行這兩種post方法。

因此,Form1的帖子和Form2的帖子,但表單集合中的值是從哪個表單提交的。

我的問題是: 這是爲什麼這兩個表單提交一組表單數據? 如何才能使用正確的表單數據僅調用相關操作?

我確定我犯了一個簡單的錯誤,就是看不到它。演示該問題

項目可以在這裏找到:提前TestMVC.zip

感謝。

+0

我已經添加了一個測試項目,在c#中演示了這個問題。 – jimplode 2010-10-01 10:48:46

+0

有甚至有另一種方法來實現相同的事情?如果對象恰好無效,則保留後期數據。 – jimplode 2010-10-01 11:28:51

回答

1

我發現問題的解決方案,想知道是否有人想評論這種「解決方法」的正確性。

ok ...第一步,從發佈操作中移除childonlyaction屬性,並添加控制器/操作以在提交表單時運行。

Html.BeginForm("Form1", "Form") 

這確保了調用正確的後操作。

下一步是找出我想要返回的東西。

所以..我需要的,如果存在驗證錯誤,等等。所以想我可以做到這一點使用元數據或其他自定義驗證,模型添加到TempData,然後返回定製機型做一個RedirectToAction作出行動我來自的頁面。即/首頁/索引或/控制器/動作

我從引用鏈接獲取控制器/操作,應該始終將其設置爲來自後操作。

任何人都可以想到一個更好的方式做到這一點?因爲這是我能找到的結果,我希望在不使用Ajax的情況下獲得結果的唯一方法

0

我看到,當你渲染你的表單時,你沒有明確地命名它們,你也沒有提及表單方法。你爲什麼要使用「Html.RenderAction」

<% using (Html.BeginForm("ACTION", "CONTROLLER")) {%> 

如果您使用的是子控件,則:能否請您做這樣的事?它不應該是「Html.RenderPartial」,如:

<% Html.RenderPartial("Search"); %> 
+0

不,因爲窗體不應該從路由上自己可見我使用因此必須使用RenderAction。所以不能在表單中指定控制器或動作,因爲它會嘗試在表單路徑上顯示該表單,並且我不想要。除非我錯過了這個應該怎麼做? – jimplode 2010-10-01 10:44:12

+1

我沒有獨立的解釋,但是你的Html.BeginForm()是罪魁禍首。因爲你沒有指定動作名稱。結果是.net會自動將默認操作設置爲「/」(檢查視圖源)。話雖如此,當你點擊其中一個按鈕時,它們會發布到同一頁面,因此你正在擊中兩個子窗體的「Post」。我不確定你爲什麼不想去RenderPartial? URL上顯示的子路由是如此關鍵的一點? – Pradeep 2010-10-01 12:02:45

+0

謝謝你的解釋,這是有道理的。但我想要的是這些都是有效的UserControls,自包含的形式。我希望能夠將這些包含在我的網站的任何位置。如果有更容易或更正確的方法來實現同樣的事情,那麼請教育我。 – jimplode 2010-10-01 12:11:30

0

如果你把[ChildActionOnly]關閉後你的行動,只提交到一個動作在同一時間。

因此,一種考慮它的方法是試着找出如何在整個頁面中返回一個局部視圖。也許通過在模型周圍的ViewModel中存儲頁面的路線,並在該路線上使用RedirectToAction

此鏈接(http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-2-0-Using-Multiple-Actions.aspx)似乎表明,刪除ChildActionOnly是你所需要做的,但在您的示例中不起作用。最令人困惑的。

+0

我已經看到引用這個是MVC框架中的錯誤....我可以不相信這是你在MVC中無法做到的事! – jimplode 2010-10-03 09:12:09