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

Asp.net ASP MVC路由-如何更改默认id参数的名称,同时保持默认路由不变,asp.net,asp.net-mvc,asp.net-mvc-routing,url-routing,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”作为参数名 因此,我

在我的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”,那么在我的路由配置中,只有默认路由可以正常工作。但我想保留“name”,因为在这些特定情况下它更干净。

尝试使用路由约束


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

我认为您的问题在于默认值:

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} _
        )

您的
id是什么类型的?知道这一点很重要,因为如果
名称
路由将首先出现,我们希望将其从匹配路由中排除,如果可以的话(可能存在一个看起来像id的名称,在这种情况下,我们很难将其识别为名称而不是id),在我的情况下,
id
是整数,但是否可以保留默认路由来处理任何类型的
id
?在将来,我可能必须支持字符串ID,例如..你是对的,这是一个复制粘贴错误。但这不是我问题的原因。非常感谢。
routes.MapRoute( _
            name:="Name", _
            url:="{controller}/{action}/{name}", _
            defaults:=New With {.controller = "Home", .action = "Index", .name = UrlParameter.Optional} _
        )