asp.net-core-mvc – “: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}?什么检查? 解决方法
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与该模板一起使用时没有匹配的操作,则不会选择该模板.然后框架将尝试下一个路径模板,以找到操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |