GET和POST到ASP.NET MVC中的相同控制器操作


90

我想要一个动作来同时响应Gets和Posts。我尝试了以下

[HttpGet]
[HttpPost]
public ActionResult SignIn()

那似乎没有用。有什么建议么 ?


2
解释问题:操作被忽略。每个属性都将排除所有其他请求方法,因此该操作最终根本不接受任何请求方法。
Guffa

在ASP.NET MVC2和VisualStudio 2010中,OP的示例(带有“ [[AcceptVerbs(HttpVerbs.Get)]””等)给出了编译错误:“ Duplicate'AcceptVerbs'attribute”。
DaveD

4
@戴夫你在做什么[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]还是[AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]?我对这些属性一无所知,但是如果您要进行第二次操作,这可能就是您收到该错误的原因。
Jared 2012年

Answers:


134

使用AcceptVerbs属性可以做到这一点。它有点冗长但更灵活。

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}

有关msdn的更多信息。


3
是的,但是如果该方法使用参数(例如,SignIn(SingInParams参数)...)对于GET,它们是从URI提取的(因此必须指定[FromUri]),而对于POST,它们是从正文提取的(所以[必须指定FromBody])
michal.jakubeczy

64

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

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

根据您的需要,您仍然可以通过对HttpContext.Request.HttpMethod值进行操作来根据HttpMethod执行不同的逻辑。


5
除非您尝试使用视图模型,否则这没问题!在通常会在viewmodel中传递的post操作中,我尝试使用可选参数并将其默认设置为null,但这不起作用。
JBeckton 2011年

1
@JBeckton通常我有一个GET方法,它仅具有查询字符串参数,SignIn(Guid? UserId)而POST具有视图模型,SignIn(SomeVM vm)并且都调用一个共享的私有方法SignInHandleGetPost(...)...这可能需要将VM GET方法必须初始化的VM或可选的params或您希望执行的任何操作用于重构可重用/共享的代码。
AaronLS

2
@JBeckton我现在使用ASP.NET MVC 4.6.1示例项目尝试了该方法,并且该方法AccountController.Login(String returnUrl, LoginViewModel model)运行良好。model在GET上为null,在POST上为非null。但是[ValidateForgeryToken],由于ValidateForgeryToken在GET请求上引发异常,因此需要重写。

0
[HttpGet]
public ActionResult SignIn()
{
}

[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}

那不是我想要的,那是默认的MVC实现,它具有通过函数重载分别用于GET和POST的方法。我不是MVC的新手,我试图让GET操作除了响应表单收集的标准POST操作之外,还响应某些POST事件。
Cranialsurge

然后,您需要遵循Kurts的回答。没有属性将同时处理这两种情况。如果您试图让POST请求执行不同的操作,那是不可能的。您的操作将必须执行您要寻找的切换。
杰里米·B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.