对ASP.NET MVC中的相同Controller Action执行GET和POST

Cra*_*rge 86 asp.net-mvc asp.net-mvc-2

我想要一个单独的动作响应获取和帖子.我尝试了以下内容

[HttpGet]
[HttpPost]
public ActionResult SignIn()
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.有什么建议 ?

Rya*_*air 129

这可以使用AcceptVerbs属性.它更冗长但更灵活.

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}
Run Code Online (Sandbox Code Playgroud)

更多关于msdn.

  • 是的,但如果该方法使用参数(例如SignIn(SingInParams参数)...对于GET,它们取自URI(因此必须指定[FromUri])并且对于POST它们取自身体(所以[必须指定FromBody]? (3认同)

Kur*_*ler 63

默认情况下,操作会响应GET和POST,因此您不必指定任何内容:

public ActionResult SignIn()
{
    //how'd we get here?
    string method = HttpContext.Request.HttpMethod;
    return View();
}
Run Code Online (Sandbox Code Playgroud)

根据您的需要,您可以通过操作HttpContext.Request.HttpMethod值来执行不同的逻辑,具体取决于HttpMethod.

  • 这很好,直到你尝试使用视图模型!在post动作中你通常会在viewmodel中传递,我尝试使用一个可选的param并将其默认为null但是这不起作用. (5认同)
  • @JBeckton我现在尝试使用ASP.NET MVC 4.6.1示例项目,使用方法`AccountController.Login(String returnUrl,LoginViewModel model)`并且它工作正常.`model`在GET上为null,在POST上为非null.但是`[ValidateForgeryToken]`需要被覆盖,因为`ValidateForgeryToken`会在GET请求上抛出异常. (2认同)

小智 4

[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}
Run Code Online (Sandbox Code Playgroud)