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

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

像这样:

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

我希望使用HTTP POST而不是GET发送 someValue anotherValue 值。有谁知道怎么做?

有帮助吗?

解决方案

HTTP不支持使用POST重定向到页面。当您在某处重定向时,HTTP“位置”会在header告诉浏览器去哪里,浏览器发出该页面的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,这就是你在答案中发布的链接所暗示的内容。

我很想知道什么是“错误的”有这个,如果有什么。显然,如果你真的想要向浏览器发送一个重定向,这不会起作用,但是你应该问为什么你会试图转换它,不管怎样,因为它对我来说似乎很奇怪。

希望有所帮助。

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

ACTION

TempData [" datacontainer"] = modelData;

查看

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

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

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

尝试这个

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>");

我想扩大Jason Bunting的答案

像这样

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

Eli将在这里提出如何使其成为通用变量的想法

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top