":exists"在路由模板上做了什么?

10 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?}");
});
Run Code Online (Sandbox Code Playgroud)

这是做{area:exists}什么的?什么检查?

juu*_*nas 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与该模板一起使用时没有匹配的操作,则不会选择该模板.然后框架将尝试下一个路径模板,以找到操作.

  • 它可以工作,但使用它的关键是,如果它收到一个URL,如`/ SomeArea/Home/Index`,它将首先尝试第一个路由.首先检查是否存在`area = SomeArea`的动作.然后检查它是否有"subarea = Home".此时它可能会认为这样的动作不存在,所以它拒绝匹配.然后它会尝试下一个匹配的模板(在典型的设置中).然后当然如果没有SomeArea区域,它会尝试最后一个路径模板.它实际上会匹配,思考控制器= SomeArea,action = Home,id = Index.找不到这样的动作= 404. (2认同)
  • @XPD我编辑了一下这个答案,也许有帮助吗?差别基本上是:没有约束,URL/a/b/c/d匹配第一个模板,但如果实际上没有找到这样的动作,它可能会产生404.约束确保在选择模板之前存在匹配操作,并且如果没有匹配操作将跳过它. (2认同)