如何使用POST动词重定向到页面?

时间:2020-03-06 14:41:05  来源:igfitidea点击:

当我们在控制器中调用RedirectToAction时,它会使用HTTP GET自动重定向。如何明确告诉它使用HTTP POST?

我有一个既可以接受GET请求也可以接受POST请求的动作,并且我希望能够使用POST来" RedirectToAction"并将其发送一些值。

像这样:

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

我想使用HTTP POST而不是GET发送someValueanotherValue值。有谁知道如何做到这一点?

解决方案

HTTP不支持使用POST重定向到页面。当我们重定向到某个地方时,HTTP" Location"标头会告诉浏览器要去哪里,浏览器对该页面进行GET请求。我们可能只需要编写页面代码即可接受GET请求和POST请求。

对于特定示例,我将这样做,因为我们显然并不关心实际上让浏览器无论如何都要获得重定向(通过接受已经接受的答案):

[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,这就是我们在答案中发布的链接所建议的内容。

我很想知道这有什么"错",如果有的话。显然,如果我们确实希望将重定向发送到浏览器,则将无法正常工作,但是我们应该问为什么无论如何都要进行转换,因为这对我来说很奇怪。

希望能有所帮助。