我有一个客户希望使用URL命名约定:
/{subjectarea}/{subject}/{action}
这很好 – 这个工作非常出色,每个主题区域有一个控制器,并且在id(主题)之后执行操作完全没有问题.
然而,它变得复杂,因为客户端然后想要进一步继续层次结构:
/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}
我有一个控制器用于紧密相关的主题(它只是另一个主题区域),它处理所有管理员方面,但客户端坚持让公共视图挂起父主题而不是它自己的根.
我怎么能这样做,同时避免破坏MVC的整个原则,并避免重新实现我的主题区域控制器中的大量ASP.Net MVC提供的功能,只是为了能够处理来自同一控制器的相关主题?
是否有可能以某种方式从父主题控制器中调用相关主题控制器,并返回结果视图(因为这将保持主题功能与其自己的控制器的分离)?如果可能的话,它将解决很多问题.
解决方法
这是解决我的问题的解决方案 – 希望它解决了别人的问题.
正如我对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部分的情况下完全执行此操作,因为路径可以轻松地匹配数量的值,事实上我可能确实这样做了 – 但是,我认为如果有一个静态项目,以后管理会更好确认使用该路线.
我希望这可以帮助别人!