0

我正在尝试在基于 ASP.NET MVC 的网站上创建一个页面,其中一个页面允许通过用户名而不是 ID 进行选择。我会认为路线需要是这样的:

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

但我想当它错误地应用这两者的哪条路线时会引起更多的问题。

4

3 回答 3

2

Customer 控制器的 Details 方法是否有“用户名”参数,而不是 id 参数?

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

于 2010-01-25T04:12:26.503 回答
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 = "" }
);

这只是意味着我必须为每个传递字符串值的实例专门声明一个路由。

于 2010-01-25T04:12:18.017 回答
1

我不确定我是否完全理解这个问题......你是说你想要:

  1. 一个处理第三个令牌是字符串的 URL 的路由{controller}/{action}/{username},匹配存在字符串“用户名”参数的操作,以及

  2. 处理第三个令牌是整数的 URL 的另一个路由{controller}/{action}/{id},匹配存在整数“id”参数的操作?

如果是这样,请检查MapRoute 的重载,它采用指定路由约束的第四个参数。它应该让你做这样的事情:

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

这个(未经测试的)约束应该导致 {username} 路由匹配第三个令牌包含至少一个非数字字符的任何内容。

Of course, if it's legal for usernames to consist entirely of digits then this may not work for you. In that case, you may need to create specialized routes for each action that accepts a username instead of an ID.

于 2010-01-25T04:29:35.380 回答