【问题标题】:post and get with same method signature使用相同的方法签名发布和获取
【发布时间】:2009-04-07 06:48:23
【问题描述】:

在我的控制器中,我有两个名为“朋友”的动作。执行的取决于它是“get”还是“post”。

所以我的代码 sn-ps 看起来像这样:

// Get:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

// Post:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Friends()
{
    // do some stuff
    return View();
}

但是,这不会编译,因为我有两个具有相同签名的方法(朋友)。我该如何去创造这个?我是否只需要创建一个操作,但要区分其中的“获取”和“发布”?如果是这样,我该怎么做?

【问题讨论】:

    标签: asp.net-mvc post controller get asp-net-mvc-1


    【解决方案1】:

    将第二种方法重命名为“Friends_Post”之类的其他名称,然后您可以将[ActionName("Friends")] 属性添加到第二种方法中。因此,请求类型为 POST 的 Friend 操作的请求将由该操作处理。

    // Get:
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Friends()
    {
        // do some stuff
        return View();
    }
    
    // Post:
    [ActionName("Friends")]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Friends_Post()
    {
        // do some stuff
        return View();
    }
    

    【讨论】:

    • 由于 MVC 2.0 [AcceptVerbs(HttpVerbs.Get)] 可以缩短为 [HttpGet],其他 REST 方法也是如此
    【解决方案2】:

    如果你真的只想要一个程序来处理两个动词,试试这个:

    [AcceptVerbs("Get", "Post")]
    public ActionResult ActionName(string param1, ...)
    {
    //Fun stuff goes here.
    }
    

    一个潜在的警告:我使用的是 MVC 版本 2。不确定 MVC 1 是否支持此功能。AcceptVerbs 的 Intellisense 文档应该让您知道。

    【讨论】:

    • [AcceptVerbs("Get","Post")] 应该可以工作,因为它的构造函数被定义为 AcceptVerbsAttribute(params string[] verbs)。看起来更整洁。
    • 谢谢!我更喜欢这样。
    • 更重要的是,[HttpGet][HttpPost] 失败了,因为每个都被设计为只允许一种类型。
    【解决方案3】:

    尝试使用:

    [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
    public ActionResult Friends()
    {
        // do some stuff
        return View();
    }
    

    【讨论】:

      【解决方案4】:

      不完全确定这是否是正确的方法,但我会使用无意义的参数来区分信号。喜欢:

      // Get:
      [AcceptVerbs(HttpVerbs.Get)]
      public ActionResult Friends(bool isGet)
      {
          // do some stuff
          return View();
      }
      
      // Post:
      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult Friends()
      {
          // do some stuff
          return View();
      }
      

      我知道这很丑陋,但它确实有效。

      【讨论】:

        【解决方案5】:

        将 cagdas 的回复标记为答案,因为它回答了我的问题。但是,由于我不喜欢在我的项目中使用 ActionName 属性,所以我使用了不同的解决方案。我只是将 FormCollection 添加到“发布”操作中(最终更改了方法签名)

        // Get:
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Friends()
        {
            // do some stuff
            return View();
        }
        
        // Post:
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Friends(FormCollection form)
        {
            // do some stuff
            return View();
        }
        

        【讨论】:

        • 最好使用更多类型的方法来接收发布的项目 - 请参阅答案
        【解决方案6】:

        将要在帖子中接收的参数添加到 Post 方法。可能是这样的:

        // Post:
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Friends(string friendName, string otherField)
        {
            // do some stuff
            return View();
        }
        

        ..或者如果你有一个复杂的类型,像这样:

        // Post:
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Friends(Friend friend)
        {
            // do some stuff
            return View();
        }
        

        编辑:最好使用更多类型的方法来接收发布的项目,就像上面一样。

        【讨论】:

          【解决方案7】:

          你的动作方法不能做同样的事情,否则就没有必要编写两个动作方法。因此,如果语义不同,为什么不对动作方法也使用不同的名称呢?

          例如,如果您有一个“删除”操作方法,而 GET 只是要求确认,您可能会调用 GET 方法“ConfirmDelete”而 POST 方法只是“删除”。

          不确定这是否符合您的情况,但当我遇到同样的问题时,它总是对我有用。

          【讨论】:

            猜你喜欢
            • 2014-11-05
            • 2013-06-05
            • 2012-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-15
            • 1970-01-01
            相关资源
            最近更新 更多