1

ASP.NETMVCアプリケーションでエリアルートを設定しようとしています。

また、通常のMVCレジスター領域のルートではなく、nugetパッケージのAttributeRoutingを使用しています。

私の理解では、エリアルートは次のようになります。/area/controller/method

私がやろうとしていることは:-/api/search/index

つまり:

  • エリア=>API
  • コントローラー=>SearchController
  • ActionMethod=>インデックス

[RouteArea("Api")]
public class SearchController : Controller
{
    [POST("Index")]
    public JsonResult Index(IndexInputModel indexInputModel) { .. }
}

しかし、それはそのルートを作成しません。これはそれが作成するものです:/api/index コントローラーsearchがありません。

ドキュメントを見て気づいたRoutePrefixので、これを試してみました。

[RouteArea("Api")]
[RoutePrefix("Search")]
public class SearchController : Controller
{
    [POST("Index")]
    public JsonResult Index(IndexInputModel indexInputModel) { .. }
}

そしてそれは実際にルートを作成します/api/search/index

しかし、なぜ私RoutePrefixはそこに入れる必要があるのですか?SearchControllerこれがaであることをすでに理解し、3セグメントルートを作成するのに十分賢いのではないでしょうか。

4

1 に答える 1

1

RoutePrefix をどこにも置く必要はありません。リファクタリング/DRY支援としてそこにあるだけです。検討:

[RouteArea("Api")]
public class SearchController : Controller 
{
    [POST("Search/Index")]
    public ActionResult Index() { }
}

多数のアクションがある場合、それらすべてに「検索」プレフィックスを付けたい場合は、次のようにします。

[RouteArea("Api")]
[RoutePrefix("Search")]
public class SearchController : Controller 
{
    [POST("Index")]
    public ActionResult Index() { }

    // Other actions to prefix....
}

それは十分にスマートであるべきではありませんか?

生意気ではありませんが、いいえ。AR は、すべてのコードを読み取り、魔法のようにルートを生成することを意図したものではありません。これは、URL を常に念頭に置くことを目的としており、そのためにURL を表示する必要があります。これが最良または唯一の方法であるというわけではありませんが、最初からそれが私の意図でした。

それが十分に賢くない本当の理由は、「エリア」の概念が URL とは何の関係もないからです。エリアは論理単位です。ルートプレフィックスなしでその論理ユニットを公開することもできます(したがって、〜/にぶら下がっています)、または「This/Is/A/Prefix」から公開することもできます。

ただし、十分にスマートにしたい場合は....v3.4をリリースしたばかりで、これを実行できます(必要な場合は必要ありません):

namespace Krome.Web.Areas.Api
{
    [RouteArea]
    [RoutePrefix]
    public class SearchController : Controller 
    {
        [POST]
        public ActionResult Index() { }
    }
}

これにより、次のルートが生成されます: ~/Api/Search/Index. この領域は、コントローラーの名前空間の最後のセクションから取得されます。ルートプレフィックスはコントローラー名から取得されます。残りの URL はアクション名から取得されます。

もう一つ

コントローラー内の個々のアクションのルート エリア URL とルート プレフィックス ラットの巣を取得する場合は、次のようにします。

[RouteArea("Api")]
[RoutePrefix("Search")]
public class SearchController : Controller 
{
    [POST("Index")]
    public ActionResult Index() { }

    [GET("Something")] // yields ~/Api/Search/Something
    [GET("NoPrefix", IgnoreRoutePrefix = true)] // yields ~/Api/NoPrefix
    [GET("NoAreaUrl", IgnoreAreaUrl = true)] // yields ~/Search/NoAreaUrl
    [GET("Absolutely-Pure", IsAbsoluteUrl = true)] // yields ~/Absolutely-Pure 
    public ActionResult Something() {}
}
于 2012-12-12T07:35:32.040 に答える