【问题标题】:MVC Custom Routes and ActionLinksMVC 自定义路由和 ActionLinks
【发布时间】:2010-01-18 20:59:03
【问题描述】:

我们正在使用由多个客户端共享的 asp.net mvc 应用程序。我们需要 url 来包含客户 url 友好名称。例如:

domain.com/clientName/controller/action/id

以下在路由方面似乎可以正常工作,但未为操作链接帮助程序正确生成“clientName”。

_routes.MapRoute("DefaultRoute",
                "{clientName}/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = string.Empty },
                new { clientName = @"[\w-]+" });

我们希望继续使用 Html.ActionLink Helper 方法,但它在生成的链接中不包含 clientName。在这种情况下我们是否必须编写自己的帮助程序,还是有其他方法?

有没有其他人使用这种类型的路由场景构建应用程序?任何建议将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    根据我的经验,Darin 引用的 ActionLink 方法会生成如下 URL:

    http://host/Home/action?clientName=someClient
    

    如果您想完全按照您指定的方式生成 URL。查看 RouteLink 方法,该方法可让您指定要匹配的 Route 的名称:

    <%= Html.RouteLink("some text", "DefaultRoute", new { clientName = "someclient" })%>
    

    【讨论】:

    • @Bryan,我已经测试了我提供的代码,它生成了预期的 url。也许在您的情况下,您将路线声明以错误的顺序放置,并且执行的是包罗万象的路线。具体路线应放在包罗万象的路线之前。
    • 很好的答案,我在试验 MVCContrib Portable Area 路由时遇到了同样的问题。不是它像一个魅力。
    • RouteLink 也适用于我,而 ActionLink 不适用于我检查和仔细检查的路线。令人沮丧的是我不知道我是否无法理解路由配置,或者 ActionLink 正在做一些奇怪的事情。
    【解决方案2】:

    你需要指定路由值:

    <%= Html.ActionLink("some text", "action", new { clientName = "someclient" })%>
    

    将生成:

    http://host/someclient/Home/action
    

    你也可以在声明路由时指定一个默认值:

    _routes.MapRoute("DefaultRoute",
        "{clientName}/{controller}/{action}/{id}",
        new { 
            controller = "Home", 
            action = "Index", 
            id = string.Empty, 
            clientName = "defaultClient" },
        new { clientName = @"[\w-]+" });
    

    【讨论】:

    • 这很有魅力。正如您在另一条评论中所说,您必须将所有路线放在最后,否则您可能会得到意想不到的结果
    【解决方案3】:

    您正在尝试做的事情应该可以工作,而无需使用 RouteLink 或指定匿名对象。确保您的路线注册是正确的。例如,如果你有类似的东西:

    routes.MapRoute("Base", 
                    string.Empty,
                    new { controller = "Home", 
                    action = "Index", 
                    id = string.Empty });
    

    在您的 DefaultRoute 之前,它可能会导致对 ActionLink 的调用返回奇怪的结果。我以前也被这个烫伤过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多