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

Chr*_*ann 123 asp.net-mvc url-redirection

RedirectToAction控制器内调用时,它会使用HTTP GET自动重定向.如何明确告诉它使用HTTP POST?

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

像这样:

this.RedirectToAction(
    "actionname",
    new RouteValueDictionary(new { someValue = 2, anotherValue = "text" })
);
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*ing 157

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

[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();
}
Run Code Online (Sandbox Code Playgroud)

这很容易,并且没有真正有趣的业务 - 这可以让你保持第二个真正只接受HTTP POST请求的事实(除非在这个例子中,无论如何都在你的控制之下)并且你不必也可以使用TempData,这就是你在答案中建议的链接.

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

希望有所帮助.

  • 我投票了,虽然我不同意在你不认识他们的时候打电话给白痴. (39认同)
  • 我本身并没有投票,但我可以看到理由.该方法违反了MVC模式建立的编码约定.它**仅在调用相同的动作时起作用.如果操作是另一个,即使在同一个控制器上,路由值也会被拧紧,并返回错误的视图.简而言之:不要这样做. (14认同)
  • 谁知道你被投票的原因.这是一种非常有用的方法. (7认同)
  • 我不是一个downvoter,但是对此的一个警告是,如果你要使用不同的名称调用视图,或者参数很重要,它们就会丢失.原因是URL将反映服务器端重定向之前的操作+参数.这可能导致用户混淆,特别是如果他们刷新页面然后发现自己在前一页(因为刷新使用了旧URL).这种技术基本上与asp.net的Server.Transfer非常相似,应该遵循相同的注意事项. (3认同)
  • 这就是我总是如何解决这个问题.贬低这一点毫无意义. (2认同)

Eli*_*ght 97

HTTP不支持使用POST重定向到页面.当你重定向到某个地方时,HTTP"Location"标题会告诉浏览器去哪里,浏览器会对该页面发出GET请求.您可能只需编写页面代码即可接受GET请求以及POST请求.

  • 虽然这个答案基本上是正确的,但它并不完整.请参阅下面的Jason Bunting答案,以获得更好的解决方法. (13认同)
  • 好奇为什么我的答案不被接受,我认为我的言论是合理的.:)然后,我可能有点偏见它... (4认同)

Ott*_*lis 18

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

行动

TempData["datacontainer"] = modelData;

视图

var modelData= TempData["datacontainer"] as ModelDataType; 
Run Code Online (Sandbox Code Playgroud)

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

因此,使用TempData可靠地工作的唯一方案是重定向时.


vic*_*cky 8

试试这个

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>");
Run Code Online (Sandbox Code Playgroud)

  • 讨厌它但喜欢它:) (4认同)

Yit*_*erg 5

我想扩大Jason Bunting的答案

像这样

ActionResult action = new SampelController().Index(2, "text");
return action;
Run Code Online (Sandbox Code Playgroud)

Eli将会在这里对如何使它成为泛型变量有一些想法

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

  • 您不应该使用“new ...()”创建控制器实例,因为您将丢失“RequestContext” - 如果您已经在同一个控制器中,则可能不需要创建新实例。否则,采取以下方式:`SampelController SampleController = DependencyResolver.Current.GetService&lt;SampelController&gt;()`然后:`sampleController.ControllerContext = new ControllerContext(Request.RequestContext, SampleController);`然后你可以`return SampleController.Index(2 ,“文本”);`只是一个提示:) (3认同)