2009-12-15 40 views
0

MVC鼓勵使用RESTful URL,但HTML表單本質上是將數據附加到查詢字符串值中。我的動作將「文本」作爲字符串參數。而我的形式是:我該如何學會停止擔心並熱愛ASP.NET MVC Forms?

<% using(Html.BeginForm("Action", "Controller")) { %> 
    <%= Html.TextBox("text") %> 
    <input type="submit" value="submit" /> 
<% } %> 

我的動作是:

public ActionResult Action(string text) 
{ 
    ... 
    return toInnocence; 
} 

有兩種不同的URL,你的行動可以映射到:

  1. ~/Controller/Action/textvalue感謝您的路線圖{控制器}/{action}/{text}
  2. ~/Controller/Action?text=textvalue從表單提交時

我的問題是:

如何區分兩種形式並在後一種情況下進行重定向?第二種形式打破了RESTful原則。那裏的最佳做法是什麼?我不想查詢RouteData.Values集合,因爲它以自然,直接的方式打破了將請求參數映射到函數參數的整個目的。這是一個非常基本的場景,我希望MVC能夠很好地處理這個問題。

第二種形式不映射到控制器操作中的「text」參數。爲什麼?我怎樣才能創建相同動作的重載版本呢?我是否必須創建一個新操作並將其用於表單提交?當然,我可以解決所有這些問題,但同時我害怕在某個地方錯過大局。

看起來好像人們相處得很順利,所以我覺得我是唯一一個被路由值與查詢字符串混淆的人。

編輯:我看着維基百科是如何做到這一點的。它針對「表單獲取者」和實際寧靜的URL使用單獨的操作,並根據需要從一個到另一個重定向。我想這將是最好的方式。

+0

我不明白如果第一種形式不是第二種形式可能會違反REST。要麼他們都是,要麼都不是。 – qid 2009-12-15 16:13:18

+0

如果查詢字符串完全描述了一個URL,爲什麼我們首先要有URL路由?我們可以與Controller.aspx?action = action&id = id表單相處嗎? – 2009-12-15 16:26:40

回答

3

瀏覽器的默認操作是將GET表單中的值放入查詢字符串中。他們都將解決路線並採取相同的行動。

{ controller = "Controller", "Action", id = null, text = "textvalue" } 

由於缺省路由的存在,會正確解析。

我能想到做你所要求的唯一方法就是改變形式。不要提交「GET」請求,因爲你不需要POST(你可以用JS做到這一點,並且友好的降級到POST)並重定向到GET,所以不要提交「GET」請求。

+0

那麼最佳做法是對錶單提交和URL使用單獨的操作? – 2009-12-15 16:12:08

+1

查看Post-Redirect獲取的#13:http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx IMO ,一個帖子有點多。您可以使用JS創建放置請求。 (Put請求不會創建典型的瀏覽器「重新提交POST數據?」彈出窗口。) – 2009-12-15 16:30:39