我试图在基于 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 = "" }
);

但我想当它错误地应用两者中的哪条路线时,会导致更多问题。

有帮助吗?

解决方案

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

  1. 一条路线 {controller}/{action}/{username} 处理第三个标记是字符串的 URL,匹配有字符串“用户名”参数的操作,以及

  2. 另一条路线 {controller}/{action}/{id} 处理第三个标记是整数的 URL,匹配有整数“id”参数的操作?

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

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

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

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

其他提示

请问你的客户控制器的详细方法有一个“用户名”参数,而不是一个ID参数?

如果参数不匹配,那么他们得到所附作为查询字符串变量。

这有效:

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top