web-dev-qa-db-ja.com

RoutePrefix vs Route

RoutePrefixは単独ではルーティングテーブルにルートを追加しないことを理解しています。アクションでは、Route属性を宣言する必要があります。正式なブログ/ msdnページ/ defalut RoutePrefixがルーティングテーブルにルートを追加しない理由を説明するものを見つけるのに苦労しています。

誰もがこれを含む権威のある投稿を持っていますが、そうであれば、誰であるかを教えてください。どうもありがとうございました。

Edit質問を明確にするために

動作しない

[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    public int get(){return 1000000;}
}

作品

[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
    [Route("")]
    public int get(){return 1000000;}
}

上記のシナリオは、getSteveControllerアクションに空のルートがあることを明示的に述べているため機能します。これを行うと、ルートがRouteTableに追加されます

最初のシナリオは機能しません。なぜなら、RoutePrefixを使用してもルートテーブルに何も追加されないからです。 RoutePrefix自体はルートを生成しません。これは一般的な知識のようですこれがなぜであるかを述べた情報源を知りたいです。尊敬されるコミュニティメンバー、つまりJon SkeetまたはMicrosoftチームの誰かが望ましい

21
gh9

ルートプレフィックスは、属性ルーティングの設計によりルートに関連付けられます。

コントローラー全体に共通のプレフィックスを設定するために使用されます。

この機能を紹介したリリースノートを読むと、主題についての理解を深めることができます。

ASP.NET Web API 2

属性ルーティング

ASP.NET Web APIは、Tim McCallの貢献のおかげで、属性ルーティングをサポートするようになりました。属性ルーティングでは、次のようにアクションとコントローラーに注釈を付けることにより、Web APIルートを指定できます。

[RoutePrefix("orders")] 
public class OrdersController : ApiController 
{ 
    [Route("{id}")] 
    public Order Get(int id) { } 
    [Route("{id}/approve")] 
    public Order Approve(int id) { } 
} 

属性ルーティングにより、Web APIのURIをより詳細に制御できます。たとえば、単一のAPIコントローラーを使用してリソース階層を簡単に定義できます。

public class MoviesController : ApiController 
{ 
    [Route("movies")] 
    public IEnumerable<Movie> Get() { } 
    [Route("actors/{actorId}/movies")] 
    public IEnumerable<Movie> GetByActor(int actorId) { } 
    [Route("directors/{directorId}/movies")] 
    public IEnumerable<Movie> GetByDirector(int directorId) { } 
} 

ASP.NET Web API 2.1の新機能

ASP.NET Web API 2.2の新機能

この件に関する本当に良い記事

ASP.NET 5 Deep Dive:Routing

この問題に関する専門家はいませんが、これがどのように機能するかについての私の理解はここにあります。

属性ルーティングでは、フレームワークはコントローラーのアクションのルート属性を検査して、ルートエントリを作成し、ルートテーブルに追加します。したがって、属性ルーティングを使用している限り、[RouteAttribute]。この属性がないと、アクションはデフォルトで規則ベースのルーティングに戻ります。 RoutePrefixAttributeは、ルート/ Urlの定義方法をより詳細に制御できる拡張ポイントです。リリースノートにも同じことが書かれています。

私の理解と提供された最後のリンクを除いて、他のすべてはMSドキュメントから引用されました。

19
Nkosi

信頼できるソースについては、MSDNの説明(エンファシスマイニング)を参照してください。

RouteAttribute

コントローラーまたはアクションを配置して、ルートを介して直接公開します。コントローラーに配置すると、System.Web.Mvc.RouteAttributeがコントローラーにないアクションに適用されます。

RoutePrefixAttribute

コントローラ内のすべてのアクションに適用されるルートプレフィックスでコントローラに注釈を付けます。

ご覧のとおり、Routeの説明にはアクションの公開が記載されていますが、RoutePrefixは公開していません。

7
Robert Dennis