4

エリアは 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[ HelpPageWeb 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 です。ルーティング自体が正しく機能しているため (プレフィックスを含む)、これは私には意味がありません。助言がありますか?

4

2 に答える 2

2

クリスからの回答を詳しく説明するために、次のコード ブロックで動作させることができました。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ジェネリック拡張メソッドをスコープに入れるために、ファイルの先頭に追加します。

于 2014-08-07T01:16:02.113 に答える
2

最近同じ問題が発生しました... LINQ 式に小さなエラーがあります。

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

読む必要があります:

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

とにかく、これは私にとってはうまくいきます。

于 2013-11-15T14:57:24.997 に答える