当您在控制器中调用RedirectToAction
时,它会使用HTTP GET自动重定向。如何明确告诉它使用HTTP POST?
我有一个接受GET和POST请求的操作,我希望能够RedirectToAction
使用POST并向其发送一些值。
像这样:
this.RedirectToAction(
"actionname",
new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);
我希望使用HTTP POST而不是GET发送someValue
和anotherValue
值。有谁知道怎么做?
答案 0 :(得分:149)
对于您的特定示例,我会这样做,因为您显然不关心实际上浏览器是否获得重定向(通过接受您已接受的答案):
[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,这就是你在答案中发布的链接所暗示的内容。
我很想知道这有什么“错误”,如果有的话。显然,如果你真的想要向浏览器发送一个重定向,这不会起作用,但是你应该问为什么你会试图转换它,不管怎样,因为它对我来说似乎很奇怪。
希望有所帮助。
答案 1 :(得分:94)
HTTP不支持使用POST重定向到页面。当你重定向到某个地方时,HTTP“Location”标题会告诉浏览器去哪里,浏览器会对该页面发出GET请求。您可能只需编写页面代码即可接受GET请求以及POST请求。
答案 2 :(得分:18)
如果要在重定向期间在两个操作之间传递数据而不在查询字符串中包含任何数据,请将模型放在TempData对象中。
ACTION
TempData["datacontainer"] = modelData;
查看
var modelData= TempData["datacontainer"] as ModelDataType;
TempData意味着一个非常短暂的实例,您只应在当前和后续请求中使用它!由于TempData以这种方式工作,您需要确定下一个请求将是什么,并且重定向到另一个视图是唯一可以保证这一点的时间。
因此,使用TempData可靠地工作的唯一情况是重定向时。
答案 3 :(得分:7)
尝试这个
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>");
答案 4 :(得分:4)
我想扩大Jason Bunting的答案
像这样ActionResult action = new SampelController().Index(2, "text");
return action;
Eli将在这里提出如何使其成为通用变量的想法
可以获得所有类型的控制器