2010-01-25 49 views
0

我想在基于ASP.NET MVC的网站上有一页,其中一页允许通过用户名而不是ID进行选择。我本来以为的路径必须是这样的:ASP.NET路由传递字符串值

routes.MapRoute(
    "CustomerView", "Customer/Details/{username}", 
    new { username = "" } 
); 

routes.MapRoute(
    "Default", "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = "0" } 
); 

但每当我使用HTML.Actionlink我得到http://mysite.com/Customer/Details?username=valuehere。我认为像普通的路线:

routes.MapRoute(
    "CustomerView", "Customer/Details/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
); 

,但我想这将导致更多的问题时,应采用两个失误是哪条路线。

回答

1

我不知道我完全理解这个问题......你说你想要的:

  1. 一个路线{controller}/{action}/{username},处理的URL,其中第三个符号是一个字符串,匹配动作,其中有一个字符串“用户名”参数,并

  2. 其他路由{controller}/{action}/{id}处理的URL其中第三个标记是一个整数,匹配有整数“ID”参数的行动?

如果是这样,检查出来,需要一个4th argument specifying route constraintsoverload for MapRoute。它应该让你做这样的事情:

routes.MapRoute(
    "CustomerView", "{controller}/{action}/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
    new { username = @"[^0-9]+" } 
); 

这(未经测试)的约束应该引起{用户名}路线到第三个符号包含至少一个非数字字符匹配任何内容。

当然,如果用户名完全由数字组成的话是合法的,那么这可能对您无效。在这种情况下,您可能需要为每个接受用户名而不是ID的操作创建专用路由。

+0

虽然我已经研究过如何解决我的特定问题,但是关于路线如何映射的解释还是非常有帮助的,无论如何我都会将其标记为答案。 – nathanchere

1

这工作:

routes.MapRoute(
    "CustomerView", "Customer/Details/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
); 

但在上述的问题,我在第二个例子中所犯的错误是我的意思是:

routes.MapRoute(
    "CustomerView", "{controller}/{action}/{username}", 
    new { controller="Customer", action = "Details", username = "" } 
); 

这只是意味着我必须明确申报的路线对于我传递字符串值的每个实例。

2

您的客户控制器的Details方法是否有一个“username”参数,而不是一个id参数?

如果参数不匹配,则它们会作为查询字符串变量追加。

+0

它确实有一个用户名参数。 – nathanchere

相关问题