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

时间:2011-01-21 20:38:28

标签: 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 }

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

public ActionResult Index() 
public ActionResult Details(int id) 
public ActionResult DetailsByUsername(string username) 

您需要添加路线以满足以下要求:

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

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

一个。用以下代码段替换第05行。

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

当ASP.NET MVC路由查找要映射到的操作时,需要考虑几个因素:

  1. 操作名称(不区分大小写)
  2. 参数名称(不区分大小写)
  3. 约束是否在路线上匹配。
  4. 因此,如果您想要一条符合您列出的标准的路线,这条路线将是正确答案:

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

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

    http://example.com/my_user_name
    
    1. 操作名称匹配,
    2. 它正在寻找名为'username'和
    3. 的动作中的参数
    4. 符合非字母数字字符的条件。
    5. C是正确答案,因为它会添加到当前路线中。

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

答案 1 :(得分:2)

C是对的。

对于B,如果您更换第05行,那么所有其他路线将无效。 你还需要在第04行插入,因为如果没有,05行路线将在它有机会之前捕获它。

答案 2 :(得分:1)

替换路线会使Details无效,因为Id不再映射。

C是正确的