【问题标题】:ASP.NET MVC Url routing problemsASP.NET MVC Url 路由问题
【发布时间】:2011-03-10 18:50:49
【问题描述】:

我是 MVC 和 URL 路由的新手,正在寻找一些指导。

我希望能够为每个用户提供一个 URL,其格式为: http://www.example.com/username

所以我添加了以下路线:

routes.MapRoute(
    "UserRoute", // Route name
    "{username}", // URL
    new { controller = "Users", action = "ViewUser", username = UrlParameter.Optional }
);

如果它是 FIRST 路由,效果很好,但它搞砸了默认的 {controller}/{action}/{id} 路由。现在,当我尝试访问根页面时,它会尝试使用 null 参数(或使用“favicon.ico”作为参数)加载我的 UsersController“ViewUser”操作。

如果我将新路由放在默认路由之后,则 MVC 会尝试查找名为 username 的控制器,但由于找不到它而失败。

有没有什么方法可以在不破坏常规路由系统的情况下获得 {username} 形式的 URL?我可能会为我拥有的每个控制器编写一个自定义路由,但这似乎很容易出错。

【问题讨论】:

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


【解决方案1】:

您可以查看this link 看看是否有帮助。它还在创建仅包含用户名的 url。

【讨论】:

  • 这个解决方案(它使用反射来查找所有其他控制器)似乎有点奇怪,但我想它应该可以工作。我猜这个特定的 URL 方案不是 MVC 团队所期望的。
【解决方案2】:

您可以对默认路由的允许控制器值进行约束,而不是为每个控制器创建一个路由。

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL
    new { controller = "controller1", action = "defaultaction", id = UrlParameter.Optional }, //default values
    new { controller = @"controller1|controller2|controller3|..." }
);

当控制器与其中任何一个都不匹配时,它将尝试下一个路由

【讨论】:

  • 这可能有效,但实际上并不比单独列出每个控制器更好。我仍然必须记住列出每一个,而且我知道一年后我将添加一个新控制器,然后花一个小时与 404 作斗争,然后才想起我使用的路由黑客。
  • @Henry,这是逻辑问题。由于您的两条路线都满足根 url,因此您是了解要加载什么的计算机?它只使用第一个。您可以将您的 UserRoute 网址更改为 "user/{username}" 来修复它,但这会改变您想要的网址格式..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2011-11-11
  • 2013-11-13
  • 2011-11-30
相关资源
最近更新 更多