具有复杂路线的ASP.Net MVC - 如何保持“理智”?

时间:2012-03-04 16:51:29

标签: asp.net-mvc url-routing asp.net-mvc-routing

我有一个客户希望使用URL命名约定:

/{subjectarea}/{subject}/{action}

哪个好 - 这个作品非常出色,每个主题区域有一个控制器,并且id(主题)之后的动作完全没有问题。

然而,它变得复杂,因为客户端希望进一步继续层次结构:

/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction}

我有一个控制器用于紧密相关的主题(它只是另一个主题区域),它处理所有管理员方面,但客户端坚持让公共视图挂在父主题而不是它自己的根目录。

如何避免破坏MVC的整个主体,同时避免在我的主题区域控制器中重新实现大量ASP.Net MVC提供的功能,以便能够处理来自同一控制器的相关主题?

是否有可能以某种方式从父主题控制器中调用相关主题控制器,并返回结果视图(因为这将保持主题功能与其自己的控制器分离)?如果可能的话,这将解决很多问题。

2 个答案:

答案 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('/');

一旦你拥有了它,你可以做任何你想做的事情,包括将不同的主题分配给不同的处理方法进行处理。