获取和发布到 ASP.NET MVC 中的相同控制器操作
Posted
技术标签:
【中文标题】获取和发布到 ASP.NET MVC 中的相同控制器操作【英文标题】:GET and POST to same Controller Action in ASP.NET MVC 【发布时间】:2011-03-15 00:07:54 【问题描述】:我想让一个动作同时响应 Gets 和 Posts。我尝试了以下
[HttpGet]
[HttpPost]
public ActionResult SignIn()
这似乎不起作用。有什么建议吗?
【问题讨论】:
解释问题:动作被忽略。每个属性都将排除所有其他请求方法,因此该操作最终根本不接受任何请求方法。 在 ASP.NET MVC2 和 VisualStudio 2010 中,OP 的示例(带有“[AcceptVerbs(HttpVerbs.Get)]”等)给出了编译错误:“Duplicate 'AcceptVerbs' attribute”。 @Dave 你在做[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
或[AcceptVerbs(HttpVerbs.Get)][AcceptVerbs(HttpVerbs.Post)]
吗?我对这些属性一无所知,但如果你正在做第二个,那可能就是你收到该错误的原因。
【参考方案1】:
这可以使用 AcceptVerbs 属性来实现。它有点冗长但更灵活。
[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
public ActionResult SignIn()
更多关于msdn。
【讨论】:
是的,但是如果该方法使用参数(例如 SignIn(SingInParams 参数)...对于 GET,它们是从 URI 中获取的(因此必须指定 [FromUri]),对于 POST,它们'取自正文(因此必须指定 [FromBody])?【参考方案2】:默认情况下,操作会同时响应 GET 和 POST,因此您无需指定任何内容:
public ActionResult SignIn()
//how'd we get here?
string method = HttpContext.Request.HttpMethod;
return View();
根据您的需要,您仍然可以通过对 HttpContext.Request.HttpMethod 值进行操作来根据 HttpMethod 执行不同的逻辑。
【讨论】:
这很好,直到您尝试使用视图模型!在您通常会在视图模型中传递的 post 操作中,我尝试使用可选参数并将其默认为 null 但这不起作用。 @JBeckton 通常我有一个 GET 方法,它只有查询字符串参数SignIn(Guid? UserId)
和 POST 有视图模型 SignIn(SomeVM vm)
并且都调用共享私有方法 SignInHandleGetPost(...)
... 这可能需要 VM GET 方法必须初始化,或者可选参数,或者你喜欢做的任何事情来重构可重用/共享代码。
@JBeckton 我现在刚刚尝试使用 ASP.NET MVC 4.6.1 示例项目,使用方法 AccountController.Login(String returnUrl, LoginViewModel model)
,它工作正常。 model
在 GET 上为空,在 POST 上为非空。但是 [ValidateForgeryToken]
需要被覆盖,因为 ValidateForgeryToken
会在 GET 请求上引发异常。【参考方案3】:
[HttpGet]
public ActionResult SignIn()
[HttpPost]
public ActionResult SignIn(FormCollection form)
【讨论】:
这不是我要找的,这是通过函数重载为 GET 和 POST 提供单独方法的默认 MVC 实现。我对 MVC 并不陌生,我试图让 GET 操作除了表单集合的标准 POST 操作之外还响应某些 POST 事件。 那么你需要按照 Kurts 的回答。没有属性可以同时处理这两者。如果您试图让 POST 请求执行不同的操作,那是不可能的。您的操作必须执行您正在寻找的切换。以上是关于获取和发布到 ASP.NET MVC 中的相同控制器操作的主要内容,如果未能解决你的问题,请参考以下文章