【问题标题】:Optional DateTime Web API可选的日期时间 Web API
【发布时间】:2014-02-19 01:29:29
【问题描述】:

我有这样的课程:

public class FooController : ApiController
    {
        [System.Web.Http.Route("live/topperformers")]
        [System.Web.Http.AcceptVerbs("GET", "POST")]
        [System.Web.Http.HttpGet]
        public List<string> GetTopPerformers()
        {
            return new List<string>();
        }
}

当我通过“http://foo.com/live/topperformers”访问它时,它运行良好。所以现在我想在这个方法中添加一个可选的 DateTime 参数,所以我修改了该方法以获取一个 DAteTime 参数,并使其可以为空。

public class FooController : ApiController
    {
        [System.Web.Http.Route("live/topperformers/{dateTime:DateTime}")]
        [System.Web.Http.AcceptVerbs("GET", "POST")]
        [System.Web.Http.HttpGet]
        public List<string> GetTopPerformers(DateTime? dateTime)
        {
            return new List<string>();
        }
}

当我尝试访问不带参数的 URL 时,与我之前访问的相同 - 它给出了 404。像“http://foo.com/live/topperformers/2010-01-01”这样输入日期值可以正常工作。但没有日期,它会给出 404 .

我认为 Web API 以这种方式支持可选参数?我可以简单地重载并拥有两个版本,但这是否可能只用一种方法?

【问题讨论】:

    标签: c# asp.net asp.net-web-api


    【解决方案1】:

    设置可选参数 = null。试试这个:

    public class FooController : ApiController
        {
            [System.Web.Http.Route("live/topperformers/{dateTime:DateTime?}")]
            [System.Web.Http.AcceptVerbs("GET", "POST")]
            [System.Web.Http.HttpGet]
            public List<string> GetTopPerformers(DateTime? dateTime = null)
            {
                return new List<string>();
            }
    }
    

    【讨论】:

      【解决方案2】:

      你错过了让你的路线参数可选。将您的代码更改为以下内容

      public class FooController : ApiController
      {
          [System.Web.Http.Route("live/topperformers/{dateTime:datetime?}")]
          [System.Web.Http.AcceptVerbs("GET", "POST")]
          [System.Web.Http.HttpGet]
          public List<string> GetTopPerformers(DateTime? dateTime)
          {
              return new List<string>();
          }
      }
      

      路线中的问号很重要。如果你错过了它,它将像一个必需的参数一样处理(这就是你得到 404 的原因)。欲了解更多信息,请查看Optional URI Parameters and Default Values

      【讨论】:

      • 谢谢,我错过了?标记,但是它没有像您发布的那样工作 - 直到我在函数定义中将默认值 null 分配给“dateTime”变量。谢谢!
      • 我的错。我错过了将默认参数设置为@sjkm 和建议的文档(只考虑路线中的问号并监督了默认值)。太好了,它现在可以工作了!
      猜你喜欢
      • 2012-11-28
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多