MVC [HttpGet]控制器注释可选吗?

jth*_*eis 7 asp.net-mvc http-get http-post asp.net-mvc-controller

如果我有2个控制器动作:

    [HttpGet]
    public ActionResult Login()
    {
        //...

        return View();
    }
Run Code Online (Sandbox Code Playgroud)

    [HttpPost]
    public ActionResult Login(FormCollection values)
    {
        //...

        return RedirectToAction("Index","Home");
    }
Run Code Online (Sandbox Code Playgroud)

似乎Post装饰是必需的(这很有意义),但HttpGet装饰完全是可选的.无论有没有,它都能正常工作.除非另有说明,否则MVC似乎将控制器操作默认为HttpGet.

我将不得不决定是否希望我的代码的未来读者必须自己解决这个问题,或者我是否想要记住在任何地方添加HttpGet以保持一致性.但我的问题不是关于包含明确的装饰是否是一个好的做法,即使它已经违约了.

我的问题是:总是这样我不需要用HttpGet来装饰控制器方法吗?如果我做或没有明确指定,有什么方法可以咬我吗?我已经搜索了这个但是我能找到的所有帖子都描述了为什么你可能想要使用两个注释而不是特别包含HttpGet的原因.

Row*_*man 10

您不必明确指定,不.但请注意:

  • 不在动作上指定动词将意味着该方法同时接受GET和POST.但是,如果有两个操作,则标记为POST的一个将用于POST,另一个将默认用于GET.
  • 应用HttpGet意味着一个动作只接受GET请求.
  • 将标签操作标记为GET可以使其他开发人员更明显地了解您的意图.

如果我做或没有明确指定,有什么方法可以咬我吗?

不太可能.我可以想象一种情况,某些东西可能会出现一些奇怪的行为或因为它没有按预期工作,但它很少见.