2012-01-04 44 views
0

任何人都可以提出一种方法来完成以下ASP.Net路由(对于MVC 3)?ASP.Net中的值组合MVC的路由

我想有网址,在那里它决定了控制器的值实际上是ID为页面的一部分:

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

但我需要的id值,包括用于控制器以及价值,所以,如果我们有如下的URL上面:

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

我希望{ID}价值,理想,是“切尔西足球队”,控制器是“橄榄球队”的行动为“看”,附加值为“2010-2011”。

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

我知道我可以简单地将控制器中的值结合起来,但是它增加了很多额外的重复代码 - 这是否可以通过其他方式实现?

为什么我要这样做?因为我需要全部填写球队名称,但球队名称的一部分总是与控制器名称相匹配,所以为什么不把它们合并到路线中呢?

+0

不应该将{{进一步值}设置为“{* furtherValues}”吗?既然你不能在你的动作方法中创建一个连字符参数? – danludwig 2012-01-04 11:25:06

+0

它只是一个通用的代表什么林后,而不是实际工作的代码。 – Moo 2012-01-04 14:21:08

回答

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类的一节。

+0

不需要,因为这将我限制为一个控制器,当我需要能够定义或提示url中使用的控制器时。感谢您的回答tho :) – Moo 2012-01-04 12:43:51