【问题标题】:Web API Optional parameters in the middleWeb API 中间可选参数
【发布时间】:2014-03-14 15:26:07
【问题描述】:

我有以下路由映射或WEB API

[Route("Foo/Id/{id=1}/bar")]

我想让 Id 像上面那样可选,但是从客户端不管我称之为什么路由都不匹配,我得到 404 我尝试像

Foo/Id//bar

但不起作用。如果参数不在末尾,有没有办法在 web api 中使用可选参数?

【问题讨论】:

  • 另一种方法是拥有 2 条路线,并拥有您的资源,例如:GetFooById(int id = 0)。两条路线都指向这一点。
  • 我知道这样,但是如果可选参数的数量增加了,那就不可行了。在这种情况下,将有 n!路线。
  • 你能提供更多关于你想要做什么的信息吗?
  • 我有一个4个参数可选的方法,我想用它写一个属性路由。
  • 您可以为选项参数提供默认值。 routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "Foo/Id/{id}/bar", 默认值: new { id = 0 } );

标签: routing asp.net-web-api asp.net-web-api2


【解决方案1】:

您不能在 URL 中使用 //。 制作您想要的东西的唯一方法是为一个端点映射 2 条路线。 例如

config.Routes.MapHttpRoute(
   name: "BarRoute",
   routeTemplate: "Foo/Id/{id}/bar",
   defaults: new { controller = "Foo" });

config.Routes.MapHttpRoute(
   name: "BarDefaultRoute",
   routeTemplate: "Foo/Id/bar",
   defaults: new { controller = "Foo" });

【讨论】:

    【解决方案2】:

    使用 0 代替空白参数,当得到 0 时像空白一样使用它。

    【讨论】:

    • 如果 0 是实参怎么办?它不会使它成为可选的
    【解决方案3】:

    我遇到了类似的问题,我的解决方案是让路由属性可以为空,并在我不想提供值时传递一个空参数。对你来说,这将是这样的:

    [Route("Foo/Id/{id:int?}/bar")]
    

    然后我在控制器动作的逻辑中处理了 null 条件。我猜你可以像这样在控制器操作中分配一个默认值(c#):

    ///<summary>
    /// Get my foo's bars
    ///</summary>
    [Route("Foo/Id/{id:int?}/bar")]
    public HttpResponseMessage Get(int? id)
    {
        var fooId = id ?? 1; // fooId will be of type System.Int32.
        ...
    

    所以你可以调用其中任何一个:

    ~/Foo/Id/null/bar
    ~/Foo/Id/5/bar
    

    这个解决方案对我有用。

    【讨论】:

      【解决方案4】:

      please refer to this article regarding route attribute

      您可以像这样使用它并提供默认值。

      你的属性应该是这样的:

      [Route("Foo/Id/{id:int=0}/bar")]
      

      然后像没有值一样处理0(如上所述)。

      【讨论】:

      • 我已经尝试过了,所以我问了这个问题。它不是那样工作的。如果添加上述路由,Foo/Id//bar 只会返回 404
      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2012-04-04
      • 2018-03-27
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      相关资源
      最近更新 更多