【问题标题】:How do I write a route that allows for underscores in ASP.NET MVC?如何编写允许在 ASP.NET MVC 中使用下划线的路由?
【发布时间】:2011-01-21 20:38:27
【问题描述】:

我在 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 个字符之间。你应该怎么做?

A.将第 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}" } );

C.在第 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}" } );

【问题讨论】:

    标签: asp.net-mvc routing asp.net-mvc-routing


    【解决方案1】:

    当 ASP.NET MVC 路由寻找要映射到的操作时,它需要考虑几件事情:

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

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

    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. 它正在寻找名为“用户名”的操作中的参数,并且
    3. 满足非字母数字字符的标准。

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

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

    【讨论】:

    【解决方案2】:

    C 是对的。

    对于 B,如果您替换第 05 行,那么您的所有其他路线都将不起作用。 您还需要在第 04 行插入,因为如果没有,第 05 行路线甚至会在它有机会之前捕获它。

    【讨论】:

      【解决方案3】:

      替换路由会使Details 不起作用,因为不再映射 Id。

      C 是正确的

      【讨论】:

        猜你喜欢
        • 2014-02-09
        • 2011-03-09
        • 2017-06-29
        • 2010-10-27
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多