结合ASP.Net Routes for MVC中的值

时间:2012-01-04 11:20:21

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

有人建议在ASP.Net路由(MVC 3)中实现以下方法吗?

我想要的URL中确定控制器的值实际上是页面ID的一部分:

/{id}-{controller}/{action}/{further-values}

但是我需要id值来包含用于控制器的值,所以在上面我们有以下URL:

/chelsea-football-team/view/2010-2011

我想要{id}值,理想情况下是“chelsea-football-team”,控制者是“足球队”,行动是“观看”,附加值是“2010-2011” ”

我没有问题,有几条路由的控制器值硬编码到路由定义中,但我需要能够有几个控制器值。

我知道我可以简单地组合控制器中的值,但这会增加许多额外的重复代码 - 所以这是否可以通过其他任何方式实现?

为什么我要这样做?因为我需要完整的团队名称,但团队名称的一部分将始终与控制器名称匹配,那么为什么不将它们组合在路线中呢?

1 个答案:

答案 0 :(得分:1)

我想要{id}值,理想情况下是“chelsea-football-team”,控制者是“足球队”,行动是“观看”,附加值是“2010-2011” ”

...MapRoute(null, "{id}/{action}/{*furtherValues}", 
        new {
            controller = "FootballTeam",
        });

评论1后更新

您无法使用标准路由实现在URL中组合路由参数,以便单个参数同时表示变量(id)和控制器。如果你想让id成为“chelsea-football-team”,那必须是一个自包含的路由参数。您不能以MVC从id中提取控制器名称的方式组合它。

要满足此要求,您可能必须创建自定义RouteBase实现:

public class MyCustomRoutingPattern : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        // do your coding and return an instance of RouteData
    }
}

然后你会这样使用它:

routes.Add(new MyCustomRoutingPattern(
    "{id}/{action}/{*furtherValues}"));

然后,您的RouteBase实现可以从id参数中提取控制器。 Steve Sanderson和Adam Freeman撰写的Pro ASP.NET MVC3框架书中有一节介绍如何覆盖RouteBase类。