我有一个客户希望使用URL命名约定:
/{subjectarea}/{subject}/{action}
哪个好 - 这个作品非常出色,每个主题区域有一个控制器,并且id(主题)之后的动作完全没有问题。
然而,它变得复杂,因为客户端希望进一步继续层次结构:
/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}
我有一个控制器用于紧密相关的主题(它只是另一个主题区域),它处理所有管理员方面,但客户端坚持让公共视图挂在父主题而不是它自己的根目录。
如何避免破坏MVC的整个主体,同时避免在我的主题区域控制器中重新实现大量ASP.Net MVC提供的功能,以便能够处理来自同一控制器的相关主题?
是否有可能以某种方式从父主题控制器中调用相关主题控制器,并返回结果视图(因为这将保持主题功能与其自己的控制器分离)?如果可能的话,这将解决很多问题。
答案 0 :(得分:2)
这是解决我的问题的解决方案 - 希望它解决了别人的问题。
正如我对Robert Harvey的评论中所提到的,我实际需要的是另一条路线,它不使用前两个或三个组件作为控制器,动作和id,而是从以后获取这些值 - 如果你挂起这也取决于路线中的静态值,它更容易做到。
所以,这是我决定简化路线的网址:
/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}
满足此URL的路线如下:
routes.MapRoute(
"RelatedSubjects",
"{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}",
new { controller = "shoes", action = "view", id = "all" }
);
在随后的控制器操作中,我可以询问parentcontroller和parentsubject的参数值,这样我就可以过滤掉相关项目,使其特定于给定的父主题 - 问题解决了!
此路由需要高于仅处理前两个值的路由,否则您将面临另一个路由映射劫持请求的风险。
我可以在没有/ related / static部分的情况下完全执行此操作,因为路径可以轻松匹配单独的数量值,事实上我可能确实这样做了 - 但是,如果有静态项目,我认为这对以后的管理更好在那里确认使用该路线。
我希望这有助于某人!
答案 1 :(得分:1)
您可以这样做的一种方法是指定通配符路线(注意星号):
routes.MapRoute("subjects", "{action}/{*path}",
new { controller = "Subjects", action = "Index" });
这允许控制器在action
之后接收整个路径字符串。
然后,您可以在控制器方法中获取主题的层次结构,如下所示:
string[] subjects = path.Split('/');
一旦你拥有了它,你可以做任何你想做的事情,包括将不同的主题分配给不同的处理方法进行处理。