2008-09-24 38 views
94

當您在控制器中調用RedirectToAction時,它會使用HTTP GET自動重定向。我如何明確告訴它使用HTTP POST?如何使用POST動詞重定向到頁面?

我有一個行動,接受GET和POST請求,並且我希望能夠使用POST的RedirectToAction併發送一些值。

像這樣:

this.RedirectToAction(
    "actionname", 
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" }) 
); 

我想使用HTTP POST而不是GET發送的someValueanotherValue值。有誰知道如何做到這一點?

回答

84

HTTP不支持使用POST重定向到頁面。當您在某處重定向時,HTTP「位置」標頭會告訴瀏覽器去哪裏,瀏覽器會爲該頁面發出GET請求。您可能必須編寫頁面的代碼才能接受GET請求以及POST請求。

+4

好奇爲什麼我的答案不被接受,我認爲我的言辭是健全的。 :)然後,我可能會有點偏見... – 2010-11-24 22:23:03

+12

雖然這個答案基本上是正確的,但它並不完整。請參閱下面的Jason Bunting以獲得更好的解決方法。 – 2011-01-10 13:07:13

132

爲了您的具體的例子,我只想做到這一點,因爲你顯然不關心實際上具有瀏覽器中得到重定向反正(憑藉接受你已經接受了答案):

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index() { 
    // obviously these values might come from somewhere non-trivial 
    return Index(2, "text"); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(int someValue, string anotherValue) { 
    // would probably do something non-trivial here with the param values 
    return View(); 
} 

這很容易工作,並且沒有真正有趣的業務正在進行 - 這可以讓您保持第二個實際上只接受HTTP POST請求的事實(除非在這種情況下,無論如何,這都是在您的控制之下),您沒有也可以使用TempData,這就是您在答案中發佈的鏈接所暗示的內容。

我很想知道這是什麼「錯誤」,如果有什麼。顯然,如果你真的想向瀏覽器發送一個重定向,這不會起作用,但是你應該問爲什麼你會試圖轉換它,因爲它對我來說似乎很奇怪。

希望有所幫助。

3

賈森的答案張貼在大多數情況下,唯一的問題,我看到的是,它是事故傾向。即直接調用動作方法繞過應用於動作的所有過濾器。因此,如果有任何認證或計數器類型的篩選器應用於操作方法,則可能會丟失該數據。直接調用一個操作方法將會起作用,但應該謹慎應用。

16

如果您希望在重定向期間在兩個操作之間傳遞數據而不在查詢字符串中包含任何數據,請將該模型放入TempData對象中。

ACTION

TempData["datacontainer"] = modelData;

VIEW

var modelData= TempData["datacontainer"] as ModelDataType; 

TempData的意思是一個非常短暫的情況下,你應該只在當前,只有後續請求使用它!由於TempData以這種方式工作,因此您需要確切知道下一個請求會是什麼,並且重定向到另一個視圖是唯一可以保證這一點的時間。

因此,使用TempData可靠工作的唯一場景就是當您重定向時。

4

試試這個

return Content("<form action='actionname' id='frmTest' method='post'><input type='hidden' name='someValue' value='" + someValue + "' /><input type='hidden' name='anotherValue' value='" + anotherValue + "' /></form><script>document.getElementById('frmTest').submit();</script>"); 
3

我想擴大傑森鵐的回答

這樣

ActionResult action = new SampelController().Index(2, "text"); 
return action; 

以利將在這裏就如何使一些想法通用變量

可以得到所有類型的控制器