2017-05-30 15 views
2

ビューのカスタムパスを設定する方法について説明する記事を読んでいます。ルートテンプレートに「:exists」は何をしますか?

http://www.c-sharpcorner.com/article/expanding-razor-view-location-and-sub-areas-in-asp-net-core/

ルーティングコードの設定は明確ではありませんでした。

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "subAreaRoute", 
     template: "{area:exists}/{subarea:exists}/{controller=Home}/{action=Index}/{id?}"); 
    routes.MapRoute(
     name: "areaRoute", 
     template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 

これはどうしますか:{area:exists}?それは何をチェックしていますか?

答えて

1

existsは、ルート上にKnownRouteValueConstraintを適用します。対応するルート値でアクションが見つかった場合にのみルートが一致するようにします。意味既存のエリアをターゲットにしている場合はの場合は{area:exists}の場合のみルートに一致します。

あなたはここでそのソースコードを見ることができます:https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/Routing/KnownRouteValueConstraint.cs

+0

我々は{エリア:存在する}を使用していないならば、ルーティングが動作しませんか? –

+1

これはうまくいきますが、 '/ SomeArea/Home/Index'などのURLを受け取った場合、まず最初のルートを試してみるというのがポイントです。最初に、 'area = SomeArea'を使ってアクションがあるかチェックします。次に、 'subarea = Home'をチェックします。この時点では、そのようなアクションは存在しないと考えられるので、マッチを拒否します。それから、次のテンプレートが試されます(典型的な設定では一致します)。もちろん、エリアSomeAreaが存在しない場合は、最後のルートテンプレートを試します。実際には、controller = SomeArea、action = Home、id = Indexと考えることになります。そのような行動を見つけられない= 404。 – juunas

関連する問題