エリアは 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
[ HelpPage
Web API ヘルプ ページの Nuget パッケージによって作成された領域] を次のように変更してみました。
@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")
}
ただし、null 参照例外が発生します。上記の LINQ 式でg.Key.GetCustomAttributes<RoutePrefixAttribute>().FirstOrDefault()
は、すべてのコントローラーで null です。ルーティング自体が正しく機能しているため (プレフィックスを含む)、これは私には意味がありません。助言がありますか?