如何编写允许在 ASP.NET MVC 中使用下划线的路由?

Ost*_*tap 2 asp.net-mvc routing asp.net-mvc-routing

我在 MCTS 考试中遇到了以下问题。书上说答案是C,但我认为B这是正确的答案。为什么C

您创建了一个新的 ASP.NET MVC 2 Web 应用程序。在Global.asax.cs文件中创建了以下默认路由。(行号仅供参考。)

01 public static void RegisterRoutes(RouteCollection routes)
02 {
03 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
04
05 routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" } );
06 }
Run Code Online (Sandbox Code Playgroud)

您实现了一个名为 HomeController 的控制器,其中包含具有以下签名的方法。

public ActionResult Index() 
public ActionResult Details(int id) 
public ActionResult DetailsByUsername(string username) 
Run Code Online (Sandbox Code Playgroud)

您需要添加一个路由以满足以下要求:

  • 当通过调用 DetailsByUsername 操作输入用户名作为路径时,必须显示用户的详细信息。

  • 用户名可以包含字母数字字符和下划线,长度可以在 3 到 20 个字符之间。你该怎么办?

A. 用以下代码段替换第 05 行。

routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "DetailsByUsername", id = "" } );
Run Code Online (Sandbox Code Playgroud)

B. 用以下代码段替换第 05 行。

routes.MapRoute( "Default", "{controller}/{action}/{username}", new { controller = "Home", action = "DetailsByUsername", username = "" }, new { username = @"\w{3,20}" } );
Run Code Online (Sandbox Code Playgroud)

C. 在第 04 行,添加以下代码段。

routes.MapRoute( "Details by Username", "{username}", new { controller = "Home", action = "DetailsByUsername" }, new { username = @"\w{3,20}" } );
Run Code Online (Sandbox Code Playgroud)

D. 在第 04 行,添加以下代码段。

routes.MapRoute( "Details by Username", "{id}", new { controller = "Home", action = "DetailsByUsername" }, new { id = @"\w{3,20}" } );
Run Code Online (Sandbox Code Playgroud)

Cli*_*ity 5

当 ASP.NET MVC 路由查找要映射到的操作时,它会考虑以下几点:

  1. 操作名称(不区分大小写)
  2. 参数名称(不区分大小写)
  3. 约束是否在路由上匹配。

因此,如果您想要一条符合您列出的条件的路线,这条路线将是正确的答案:

routes.MapRoute( 
    "Details by Username", 
    "{username}", 
    new { controller = "Home", action = "DetailsByUsername" }, 
    new { username = @"\w{3,20}" } 
);
Run Code Online (Sandbox Code Playgroud)

由于以下原因,具有此结构的 URL 将匹配该路由:

http://example.com/my_user_name
Run Code Online (Sandbox Code Playgroud)
  1. 动作名称匹配,
  2. 它正在寻找名为“用户名”的操作中的参数,并且
  3. 满足非字母数字字符的标准。

C 是正确答案,因为它添加到当前路由中。

答案 B 替换现有的路由定义,从而阻止默认路由到Home控制器Index操作。