获取和发布到 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 中的相同控制器操作的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 和 JQuery 获取信息到控制器

将修改后的表发送到 ASP.NET MVC 中的控制器?

ASP.Net MVC 中的简单 Dropzone 实现 - 如何在控制器中获取数据?

显示从 ASP.NET MVC 中的命令行进程获取的数据

MVC 3 ASP.NET 角色-授权属性

ASP .NET MVC 500 内部服务器错误 - 在获取和发布时 - 相同的应用程序/不同的服务器