2010-07-12 80 views
75

我想要一个动作同时响应GET和POST。我试过以下GET和POST到ASP.NET MVC中的相同控制器操作

[HttpGet] 
[HttpPost] 
public ActionResult SignIn() 

这似乎没有工作。有什么建议么 ?

+0

什么不行,它是如何失败? – 2010-07-12 20:44:14

+0

解释问题:该操作被忽略。每个属性都将排除所有其他请求方法,因此该操作最终不会接受任何请求方法。 – Guffa 2011-11-03 10:47:06

+4

为什么EvilRryry的答案不被接受?它为我做了诡计。 – 2012-05-31 16:04:36

回答

0
[HttpGet] 
public ActionResult SignIn() 
{ 
} 

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

这不是我正在寻找的,这是通过函数重载为GET和POST分开方法的默认MVC实现。我对MVC并不陌生,除了表单集合的标准POST操作外,我还试图让GET操作也响应某些POST事件。 – Cranialsurge 2010-07-12 22:45:02

+0

然后你需要关注Kurts的答案。没有属性会处理这两个。如果您试图让POST请求转到不同的操作,那是不可能的。你的行动将不得不执行你正在寻找的切换。 – 2010-09-18 02:49:00

56

行动应对这两个GET和默认的帖子,这样你就不必指定任何东西:

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

根据您的需要时,你仍然可以被操作上列举HTTPMethod执行根据不同的逻辑在HttpContext.Request.HttpMethod值上。

+5

这很好,直到你尝试使用视图模型!在后期操作中,您通常会传递视图模型,我尝试使用可选参数,并将其默认为空,但这不起作用。 – JBeckton 2011-01-25 19:46:56

+1

@JBeckton通常我有一个GET方法,只有查询字符串参数'SignIn(Guid?UserId)'和POST有视图模型'SignIn(SomeVM vm)'并且都调用共享私有方法'SignInHandleGetPost(...) ......这可能需要VM必须初始化GET方法,或者可选参数,或者任何你喜欢做的重构ruseable/shared代码。 – AaronLS 2013-04-22 20:58:10

+0

@JBeckton我刚刚尝试了ASP.NET MVC 4.6.1示例项目,使用'AccountController.Login(String returnUrl,LoginViewModel模型)'方法,它工作正常。 'model'在GET时为空,在POST时为非空。但是,[ValidateForgeryToken]需要被重写,因为ValidateForgeryToken在GET请求上引发异常。 – Dai 2016-07-19 12:25:52

111

这可以使用AcceptVerbs属性。它稍微更冗长但更灵活。

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

更多关于msdn

+0

是的,但如果该方法使用参数(例如SignIn(SingInParams参数)... for GET),它们从URI获取(因此必须指定[FromUri]),并且对于POST,它们从body中获取(so [FromBody]必须指定)? – jabko87 2016-10-24 11:17:37

+0

这应该是公认的答案。 – 2017-09-13 14:13:20