3

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

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”,那么在我的路由配置中使用默认路由一切正常。但我想保留“名称”,因为在这些特定情况下它更干净..

4

2 回答 2

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]*"}}
);

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

于 2013-05-16T15:34:40.147 回答
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} _
        )
于 2013-05-16T15:38:04.790 回答