2008-09-24 36 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; 

以利将在这里就如何使一些想法通用变量

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