加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core-mvc – “:exists”在路由模板上做了什么?

发布时间:2020-12-16 03:46:42 所属栏目:asp.Net 来源:网络整理
导读:我阅读了一篇文章,讨论了如何为视图设置自定义路径. 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: "{a
我阅读了一篇文章,讨论了如何为视图设置自定义路径.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读