147

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

我有一个同时接受 GET 和 POST 请求的操作,我希望能够RedirectToAction使用 POST 并向其发送一些值。

像这样:

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

我希望使用 HTTP POST 而不是 GET 发送someValue和值。anotherValue有谁知道如何做到这一点?

4

6 回答 6

168

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

[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 ,这是您在答案中发布的链接所暗示的。

我很想知道这有什么“错误”,如果有的话。显然,如果您真的想向浏览器发送重定向,这是行不通的,但是您应该问为什么无论如何都要尝试转换它,因为这对我来说似乎很奇怪。

希望有帮助。

于 2009-08-27T19:06:41.280 回答
115

HTTP 不支持使用 POST 重定向到页面。当你重定向到某个地方时,HTTP“位置”标头告诉浏览器去哪里,浏览器对该页面发出 GET 请求。您可能只需要为您的页面编写代码以接受 GET 请求和 POST 请求。

于 2008-09-24T19:35:02.630 回答
24

如果您想在重定向期间在两个操作之间传递数据而不在查询字符串中包含任何数据,请将模型放在 TempData 对象中。

行动

TempData["datacontainer"] = modelData;

看法

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

TempData 是一个非常短暂的实例,您应该只在当前和后续请求期间使用它!由于 TempData 以这种方式工作,您需要确定下一个请求将是什么,并且重定向到另一个视图是您唯一可以保证这一点的时间。

因此,使用 TempData 可靠工作的唯一情况是在重定向时。

于 2013-10-15T10:19:32.913 回答
12

试试这个

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>");
于 2015-04-27T07:34:46.457 回答
6

我想扩展 Jason Bunting 的答案

像这样

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

Eli 将在这里寻求有关如何使其成为通用变量的想法

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

于 2016-06-14T07:13:49.037 回答
0

我刚刚遇到了同样的问题。

解决方案是像函数一样调用控制器动作

  return await ResendConfirmationEmail(new ResendConfirmationEmailViewModel() { Email = input.Email });


 [HttpPost]
        [AllowAnonymous]
        public async Task<IActionResult> ResendConfirmationEmail(ResendConfirmationEmailViewModel input)
        {
           ...

            return View("ResendConfirmationEmailConfirmed");
        }
于 2022-02-11T09:26:04.807 回答