Asp.net mvc 如何使用POST动词重定向到页面?

Asp.net mvc 如何使用POST动词重定向到页面?,asp.net-mvc,url-redirection,Asp.net Mvc,Url Redirection,当您在控制器内调用RedirectToAction时,它会使用HTTP GET自动重定向。如何明确地告诉它使用HTTP POST 我有一个接受GET和POST请求的操作,我希望能够使用POST重定向到操作,并向其发送一些值 像这样: this.RedirectToAction( "actionname", new RouteValueDictionary(new { someValue = 2, anotherValue = "text" }) ); 我希望使用HTTP POS

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

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

像这样:

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

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

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

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

这样做很容易,也没有什么有趣的事情发生——这允许您保持这样一个事实,即第二个只接受HTTP POST请求(在本例中除外,它在您的控制之下),并且您也不必使用TempData,这正是您在回答中发布的链接所建议的

如果有什么问题的话,我很想知道这有什么问题。显然,如果你真的想向浏览器发送一个重定向,这是行不通的,但是你应该问为什么你要尝试转换它,因为我觉得这很奇怪


希望能有所帮助。

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

行动

TempData[“datacontainer”]=modelData

看法

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>");
返回内容(“document.getElementById('frmTest').submit();”;

我想扩展Jason Bunting的答案

像这样

ActionResult action = new SampelController().Index(2, "text");
return action;
Eli将在这里讨论如何使其成为通用变量


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

谁知道你为什么被否决。这是一个非常有用的方法。这也是我解决这个问题的方法。向下投票这是没有意义的。我投了赞成票,尽管我不同意在你不认识的人时称他们为白痴。我不是向下投票人,但要注意的是,如果你用不同的名称调用一个视图,或者如果参数很重要,它们就会丢失。原因是URL将在服务器端重定向之前反映action+参数。这可能会导致用户混淆,尤其是当他们刷新页面后发现自己位于上一页时(因为刷新使用了旧的URL)。这项技术本质上与asp.net的Server.Transfer非常相似,同样的注意事项也应该注意。我本身没有否决投票,但我有理由这样做。此方法违反了MVC模式设置的编码约定。它只在调用相同的操作时起作用。如果动作是另一个动作,即使在同一控制器上,路由值也会被拧紧,并返回错误的视图。简言之:不要这样做。我很好奇为什么我的答案不被接受,我认为我的言辞是合理的再说一次,我可能对此有点偏见……虽然这个答案基本上是正确的,但并不完整。请参阅下面的Jason Bunting答案,了解更好的解决方法。Jason发布的答案在大多数情况下都有效,我看到的唯一问题是它容易发生事故。i、 e.调用操作方法直接绕过应用于该操作的所有筛选器。因此,如果对action方法应用了任何身份验证或计数器类型的过滤器,那么数据可能会丢失。直接调用一个动作方法会起作用,但应该小心使用。讨厌它,但喜欢它:)这样的一种黑客行为,但这是我唯一可以做我想做的事情而不违反DRY或重新连接我的整个设置的方法!谢谢您不应该使用
new…()
为控制器创建实例,因为您将丢失
RequestContext
-如果您已经在同一控制器中,您可能不需要创建新实例。否则,采用以下方法:
SampelController-sampleController=dependencysolver.Current.GetService()
then:
sampleController.ControllerContext=newcontrollercontext(Request.RequestContext,sampleController)返回sampleController.Index(2,“text”)只是一个提示:)
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>");
ActionResult action = new SampelController().Index(2, "text");
return action;