2013-05-20 55 views
16

這個問題已經被問這裏:ASP.NET MVC:RedirectToAction與參數POST操作

RedirectToAction with parameter

但是如果我有相同名稱但不同的參數兩個動作?如何重定向到POST Terms操作而不是GET Terms操作。

public ActionResult Terms() { 
    //get method 
} 

[HttpPost] 
public ActionResult Terms(string month, string year, int deposit = 0, int total = 0) { 
    //process POST request 
} 
+0

你在看RedirectToAction嗎? – PSL

+0

http://stackoverflow.com/questions/2626179/routing-to-the-actions-with-same-names-but-different-parameters –

+2

你不能重定向到一個POST操作。重定向總是一個get,所以它根本不可能。 –

回答

39

沒關係傢伙,其實我可以直接調用,而不是使用RedirectToAction像這樣的方法:

return Terms(month, year, deposit, total); 

相反的:

return RedirectToAction("Terms", {month, year, deposit, total}); 
+7

這是解決方案。但它似乎有點像黑客:在瀏覽器中的地址仍然是老方法。這樣你看不到這一點,因爲兩種方法是相同的名稱。但是當你的帶參數的方法被稱爲「TermsPost」時,問題就出現了。如何在瀏覽器地址欄中獲取「TermsPost」(而不是「條款」)? – pt12lol

+0

同意pt12lol,它保留原來稱爲操作的URL。 –

+0

@ pt12lol:這裏有兩個問題,瀏覽器確實不需要知道頁面來自哪個MVC操作,RedirectToAction應該用於內部編程管理而不是瀏覽器。傳遞到字典的模型項是:如果相關的這些行動的看法有不同的ViewModels因爲返回的動作將返回視圖回到第一個動作,因此你會得到一個'System.InvalidOperationException'有消息 – Arjang

3

你是正確的,你可以調用方法,但我強烈建議你重新考慮你的架構/實現。

HTTP協議包含安全和不安全的動詞的想法。像GET這樣的安全動詞不會以任何方式修改服務器的狀態,而不安全動詞如POST,PUT會修改狀態。通過你調用POST方法,你違反了這個原則,因爲你的POST將會修改狀態並不是不可想象的。

此外,最佳實踐規定您應該對所有操作限制動詞,因此如果第一個「條款」方法的意思是作爲GET,那麼還要向其添加HttpGet屬性以防止其他Http操作被接受服務器的行動。