什么":存在"在路线模板上做什么?

时间:2017-05-30 11:03:03

标签: asp.net-core-mvc

我阅读了一篇文章,讨论了如何为视图设置自定义路径。

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 个答案:

答案 0 :(得分:7)

exists在路线上应用KnownRouteValueConstraint。它使得路由仅在找到具有相应路由值的动作时才匹配。含义仅在{area:exists}的情况下,如果针对现有区域,则仅匹配路线。

您可以在此处查看其源代码:https://github.com/aspnet/Mvc/blob/rel/2.0.0/src/Microsoft.AspNetCore.Mvc.Core/Routing/KnownRouteValueConstraint.cs

如果你不使用exists约束,它将起作用,但使用它的关键是,如果它收到诸如/ SomeArea / Home / Index之类的URL,它将首先尝试第一个路由模板。它首先检查是否存在area = SomeArea的动作。然后它检查它是否有subarea = Home。此时它可能会认为这样的动作不存在,所以它拒绝匹配。然后它会尝试下一个匹配的模板(在典型的设置中)。然后当然如果没有SomeArea区域,它会尝试最后一个路径模板。它实际上会匹配,思考控制器= SomeArea,action = Home,id = Index。找不到这样的动作= 404。

主要区别在于,与第一个模板匹配的URL将获得没有约束的404。

使用约束时,如果URL与该模板一起使用时没有匹配的操作,则不会选择模板。 然后框架将尝试下一个路径模板,以找到操作。