Asp.net core mvc “是什么?”“存在”;你在路线模板上做什么?

Asp.net core mvc “是什么?”“存在”;你在路线模板上做什么?,asp.net-core-mvc,Asp.net Core Mvc,我读了一篇文章,讨论了如何为视图设置自定义路径 路由代码设置不清楚 app.UseMvc(routes => { routes.MapRoute( name: "subAreaRoute", template: "{area:exists}/{subarea:exists}/{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "areaRoute"

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

路由代码设置不清楚

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}
?它在检查什么?

存在
在路由上应用
KnownRouteValueConstraint
。它使路由仅在找到具有相应路由值的操作时匹配。意思是
{area:exists}
的情况下,仅当它以现有区域为目标时,它才会匹配路由

您可以在此处查看其源代码:

如果不使用exists约束,它将起作用,但使用它的要点是,如果它接收到诸如/SomeArea/Home/Index之类的URL,它将首先尝试第一个路由模板。它首先检查是否存在面积=SomeArea的操作。然后它检查是否有subrea=Home。此时,它可能会认为这样的操作不存在,因此它拒绝匹配。然后它将尝试下一个模板,该模板将匹配(在典型设置中)。当然,如果没有区域SomeArea,它会尝试最后一个路由模板。它实际上是匹配的,认为controller=SomeArea,action=Home,id=Index。没有发现这样的行为=404

主要区别在于,与第一个模板匹配的URL将得到一个404而不受约束

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

如果我们不使用{area:exists},那么路由将不起作用?它会起作用,但使用它的要点是,如果它收到一个URL,例如
/SomeArea/Home/Index
,它将首先尝试第一个路由。它首先检查是否存在
area=SomeArea
的操作。然后检查它是否有
subrea=Home
。此时,它可能会认为这样的操作不存在,因此它拒绝匹配。然后它将尝试下一个模板,该模板将匹配(在典型设置中)。当然,如果没有区域SomeArea,它会尝试最后一个路由模板。它实际上是匹配的,认为controller=SomeArea,action=Home,id=Index。找不到这样的行动我还不清楚。你能详细解释一下吗?@XPD我对答案做了一些编辑,也许会有帮助?区别基本上是:如果没有约束,URL/a/b/c/d与第一个模板匹配,但是如果没有找到这样的操作,它可能会导致404。该约束确保在选择模板之前存在匹配操作,如果没有匹配操作,则将跳过该操作。这可能过于简单,但这似乎是表示
if(exists subArea){}elseif(exists area){}else{//default}
的另一种方式。如果没有exists,它只尝试匹配的任何路由,而不尝试任何其他路由。如果与未尝试的路线有更好的匹配,则这可能会导致出现
404