Moo*_*Moo 8 asp.net-mvc url-routing asp.net-mvc-routing
我有一个客户希望使用URL命名约定:
/{subjectarea}/{subject}/{action}
Run Code Online (Sandbox Code Playgroud)
这很好 - 这个工作非常出色,每个主题区域有一个控制器,并且在id(主题)之后执行操作完全没有问题.
然而,它变得复杂,因为客户端然后想要进一步继续层次结构:
/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}
Run Code Online (Sandbox Code Playgroud)
我有一个控制器用于紧密相关的主题(它只是另一个主题区域),它处理所有管理员方面,但客户端坚持让公共视图挂起父主题而不是它自己的根.
我如何能做到这一点,同时避免破MVC整个的校长,也避免了重新实施一吨ASP.Net MVC的在我的主题区域控制器提供的功能只是为了能够从同一个控制器处理相关的科目?
是否有可能以某种方式从父主题控制器中调用相关主题控制器,并返回结果视图(因为这将保持主题功能与其自己的控制器分离)?如果可能的话,它将解决很多问题.
小智 2
这是解决我给定问题的解决方案 - 希望它能解决其他人的问题。
正如我在对 Robert Harvey 的评论中提到的,我真正需要的是另一条路线,它不使用前两个或三个组件作为控制器、操作和 id,而是从以后获取这些值 - 如果您将其挂起路线中还有一个静态值,这更容易做到。
因此,这是我决定简化路线的网址:
/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}
Run Code Online (Sandbox Code Playgroud)
满足该URL的路由如下:
routes.MapRoute(
"RelatedSubjects",
"{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}",
new { controller = "shoes", action = "view", id = "all" }
);
Run Code Online (Sandbox Code Playgroud)
在后续的控制器操作中,我可以请求父控制器和父主题的参数值,以便我可以过滤出相关项目以特定于给定的父主题 - 问题解决了!
该路由需要位于仅处理前两个值的路由之上,否则您将面临另一个路由映射劫持请求的风险。
我可以完全在没有/相关/静态部分的情况下完成此操作,因为路由可以轻松地单独匹配值的数量,事实上我确实可以这样做 - 但是,我认为如果其中有一个静态项目可以更好地进行以后的管理确认路线的使用。
我希望这可以帮助别人!
归档时间: |
|
查看次数: |
1856 次 |
最近记录: |