我阅读了一篇文章,讨论了如何为视图设置自定义路径.
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}什么的?什么检查?
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与该模板一起使用时没有匹配的操作,则不会选择该模板.然后框架将尝试下一个路径模板,以找到操作.
| 归档时间: |
|
| 查看次数: |
1932 次 |
| 最近记录: |