ASP.NET 路由传递字符串值
-
22-09-2019 - |
题
我试图在基于 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 = "" }
);
但我想当它错误地应用两者中的哪条路线时,会导致更多问题。
解决方案
我不确定我完全理解这个问题......你是说你想要:
一条路线
{controller}/{action}/{username}
处理第三个标记是字符串的 URL,匹配有字符串“用户名”参数的操作,以及另一条路线
{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 = "" }
);
这只是意味着我必须为传递字符串值的每个实例专门声明一条路由。
不隶属于 StackOverflow