MVC自定义路由和ActionLinks

时间:2010-01-18 20:59:03

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

我们正在使用由多个客户共享的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。我们是否必须在这种情况下编写自己的帮助者,还是有另一种方法?

是否有其他人使用此类路由方案构建了应用程序?任何建议将不胜感激!

3 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分:7)

您需要指定路线值:

<%= 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-]+" });

答案 2 :(得分:0)

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

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

DefaultRoute 之前,它可能导致对ActionLink的调用返回奇怪的结果。我以前被这个烧过。