我想要一个动作同时响应GET和POST。我试过以下GET和POST到ASP.NET MVC中的相同控制器操作
[HttpGet]
[HttpPost]
public ActionResult SignIn()
这似乎没有工作。有什么建议么 ?
我想要一个动作同时响应GET和POST。我试过以下GET和POST到ASP.NET MVC中的相同控制器操作
[HttpGet]
[HttpPost]
public ActionResult SignIn()
这似乎没有工作。有什么建议么 ?
[HttpGet]
public ActionResult SignIn()
{
}
[HttpPost]
public ActionResult SignIn(FormCollection form)
{
}
这不是我正在寻找的,这是通过函数重载为GET和POST分开方法的默认MVC实现。我对MVC并不陌生,除了表单集合的标准POST操作外,我还试图让GET操作也响应某些POST事件。 – Cranialsurge 2010-07-12 22:45:02
然后你需要关注Kurts的答案。没有属性会处理这两个。如果您试图让POST请求转到不同的操作,那是不可能的。你的行动将不得不执行你正在寻找的切换。 – 2010-09-18 02:49:00
行动应对这两个GET和默认的帖子,这样你就不必指定任何东西:
public ActionResult SignIn()
{
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
}
根据您的需要时,你仍然可以被操作上列举HTTPMethod执行根据不同的逻辑在HttpContext.Request.HttpMethod值上。
这很好,直到你尝试使用视图模型!在后期操作中,您通常会传递视图模型,我尝试使用可选参数,并将其默认为空,但这不起作用。 – JBeckton 2011-01-25 19:46:56
@JBeckton通常我有一个GET方法,只有查询字符串参数'SignIn(Guid?UserId)'和POST有视图模型'SignIn(SomeVM vm)'并且都调用共享私有方法'SignInHandleGetPost(...) ......这可能需要VM必须初始化GET方法,或者可选参数,或者任何你喜欢做的重构ruseable/shared代码。 – AaronLS 2013-04-22 20:58:10
@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
这可以使用AcceptVerbs属性。它稍微更冗长但更灵活。
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
{
}
更多关于msdn。
是的,但如果该方法使用参数(例如SignIn(SingInParams参数)... for GET),它们从URI获取(因此必须指定[FromUri]),并且对于POST,它们从body中获取(so [FromBody]必须指定)? – jabko87 2016-10-24 11:17:37
这应该是公认的答案。 – 2017-09-13 14:13:20
什么不行,它是如何失败? – 2010-07-12 20:44:14
解释问题:该操作被忽略。每个属性都将排除所有其他请求方法,因此该操作最终不会接受任何请求方法。 – Guffa 2011-11-03 10:47:06
为什么EvilRryry的答案不被接受?它为我做了诡计。 – 2012-05-31 16:04:36