在我的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”,一切都可以正常使用我的路由配置中的默认路由。但是我想保留“名字”,因为在这些特定情况下它更加干净。
答案 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} _
)