【问题标题】:Combining values in ASP.Net Routes for MVC为 MVC 组合 ASP.Net 路由中的值
【发布时间】:2012-01-04 11:20:20
【问题描述】:

谁能建议一种在 ASP.Net 路由(针对 MVC 3)中完成以下任务的方法?

我希望有一个 URL,其中确定控制器的值实际上是页面 id 的一部分:

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

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

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

理想情况下,我希望 {id} 值为“chelsea-football-team”,控制器为“football-team”,动作为“view”,附加值为“2010-2011” ”。

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

我知道我可以简单地组合控制器中的值,但这会增加很多额外的重复代码 - 那么这是否可以通过其他方式完成?

我为什么要这样做?因为我需要完整的团队名称,但部分团队名称将始终与控制器名称匹配,所以为什么不在路由中将它们结合起来呢?

【问题讨论】:

  • 不应该 {further-values}{*furtherValues} 吗?由于您无法在操作方法中创建连字符参数?
  • 它只是我所追求的通用表示,而不是实际工作代码。

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


【解决方案1】:

理想情况下,我希望 {id} 值为“chelsea-football-team”,控制器为“football-team”,动作为“view”,附加值为“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 Framework 书中有一节介绍了如何覆盖 RouteBase 类。

【讨论】:

  • 不,因为当我需要能够定义或提示 url 中使用的控制器时,这将我限制在一个控制器上。谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多