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

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

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

像这样:

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

我希望使用 HTTP POST 而不是 GET 发送 someValueanotherValue值。有人知道怎么做吗?

174379 次浏览

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,这就是你在回答中发布的链接所暗示的。

如果有什么问题的话,我很想知道这有什么“问题”。显然,如果你真的想发送一个重定向到浏览器,这是不会工作的,但是你应该问为什么你会试图转换,不管,因为它似乎很奇怪我。

希望能帮上忙。

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

开拍

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 会在这里提供一些关于如何使它成为泛型变量的想法

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

我刚刚经历了同样的问题。

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

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

控制器操作:

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

return View("ResendConfirmationEmailConfirmed");
}