【问题标题】:Web API Help Pages - Order controllers by route prefixWeb API 帮助页面 - 按路由前缀排序控制器
【发布时间】:2013-11-12 22:20:33
【问题描述】:

由于 Web API 中不容易支持区域(也因为我需要比项目范围的路由规则更大的灵活性),我在我的控制器上使用 [RoutePrefix] 属性将我的 Web API 控制器分组到命名空间中,例如:

[RoutePrefix["Namespace1/Controller1"]
public class Controller1 : ApiControllerBase { }

[RoutePrefix["Namespace1/Controller2"]
public class Controller2 : ApiControllerBase { }

[RoutePrefix["Namespace1/Controller3"]
public class Controller3 : ApiControllerBase { }

[RoutePrefix["Namespace2/Controller4"]
public class Controller4 : ApiControllerBase { }

[RoutePrefix["Namespace2/Controller5"]
public class Controller5 : ApiControllerBase { }

[RoutePrefix["Namespace2/Controller6"]
public class Controller6 : ApiControllerBase { }

(这些文件位于单独的文件中,其中包含操作,为简单起见,我只是将其连同实际名称一起删除。)

我正在使用 Web API 帮助页面生成帮助文档,效果很好。但是,我想按我的“命名空间”对文档进行分组和排序(按路由前缀分组,然后在每个文件夹中按字母顺序排序)。

我决定从订购开始,然后在订购开始工作后找出分组。为了让订单正常工作,我尝试从以下位置更改我的Index.cshtml [在由 Web API 帮助页面 Nuget 包创建的HelpPage 区域]:

@foreach (IGrouping<HttpControllerDescriptor, ApiDescription> group in apiGroups)
{
    @Html.DisplayFor(m => group, "ApiGroup")
}

到这里:

@foreach (IGrouping<HttpControllerDescriptor, ApiDescription> group 
    in apiGroups.OrderBy(g => g.Key.GetCustomAttributes<RoutePrefixAttribute>().FirstOrDefault().Prefix)
                .ThenBy(g => g.Key.ControllerName))
{
    @Html.DisplayFor(m => group, "ApiGroup")
}

但是,我得到一个空引用异常:在上面的 LINQ 表达式中,g.Key.GetCustomAttributes&lt;RoutePrefixAttribute&gt;().FirstOrDefault() 对于我的所有控制器都是空的。这对我来说没有任何意义,因为路由本身工作正常(包括前缀)。有什么建议吗?

【问题讨论】:

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


【解决方案1】:

最近遇到了同样的问题...您的 LINQ 表达式中有一个小错误。

apiGroups.OrderBy(g => g.Key.GetCustomAttributes<RoutePrefixAttribute>().FirstOrDefault().Prefix)

应改为:

apiGroups.OrderBy(g => g.Key.ControllerType.GetCustomAttributes<RoutePrefixAttribute>().FirstOrDefault().Prefix)

无论如何,这对我有用。

【讨论】:

    【解决方案2】:

    为了详细说明 chris 的答案,我能够使用以下代码块来实现它。我正在使用 Web API 2.2(版本 5.1.2)

    @foreach (IGrouping<HttpControllerDescriptor, ApiDescription> group in apiGroups
        .OrderBy(g => g.Key.ControllerType.GetCustomAttributes<System.Web.Http.RoutePrefixAttribute>().FirstOrDefault().Prefix)
        .ThenBy(g => g.Key.ControllerName))
    {
        @Html.DisplayFor(m => group, "ApiGroup")
    }
    

    你需要添加

    @using System.Reflection
    

    到文件顶部,以便将通用 GetCustomAttributes 扩展方法纳入范围。

    【讨论】:

      猜你喜欢
      • 2013-07-08
      • 1970-01-01
      • 2017-06-10
      • 2014-10-11
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      相关资源
      最近更新 更多