ASP MVC Routing - 如何更改默认id参数的名称,同时保持默认路由不变

时间:2013-05-16 15:11:40

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

在我的ASP MVC Web应用程序中,我的控制器通常具有带有“name”参数的操作,如下所示:

Function Consult(name As String) As ActionResult

    .....

    Return View()
End Function

我希望能够像使用“id”参数一样浏览这些操作:... / Book / Consult / MyBookName

但我希望默认路由继续使用“id”参数。换句话说,我希望默认路由接受“id”或“name”作为参数名称。

所以我尝试像这样配置我的路由,但它不起作用,因为所有请求似乎都使用第一条路线,而不是第二条路线。具有“id”参数的操作不再起作用。

     routes.MapRoute( _
        name:="Name", _
        url:="{controller}/{action}/{name}", _
        defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
    )

    //Default Route
    routes.MapRoute( _
        name:="Default", _
        url:="{controller}/{action}/{id}", _
        defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
    )

我的代码示例在VB中,但我也会在C#中接受答案:)非常感谢大家。

编辑:澄清一下,如果我只是将参数重命名为“id”,一切都可以正常使用我的路由配置中的默认路由。但是我想保留“名字”,因为在这些特定情况下它更加干净。

2 个答案:

答案 0 :(得分:4)

尝试使用路线约束。

http://msdn.microsoft.com/en-us/library/cc668201(v=vs.100).aspx#adding_constraints_to_routes

routes.MapRoute(
    "Name",
    "{controller}/{action}/{name}",
    new { controller = "Home", action = "Index", id = "" },
    new RouteValueDictionary 
        {{"name", "[a-zA-Z]*"}}
);

这应该将路由限制为仅包含字母的名称。如果名称可以包含数字,请相应地调整正则表达式。

答案 1 :(得分:0)

我相信你的问题是默认值:

routes.MapRoute( _
        name:="Name", _
        url:="{controller}/{action}/{name}", _
        defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
    )

.id应与您的参数名称匹配,因此请尝试:

routes.MapRoute( _
            name:="Name", _
            url:="{controller}/{action}/{name}", _
            defaults:=New With {.controller = "Home", .action = "Index", .name = UrlParameter.Optional} _
        )