2011-03-10 159 views
0

我是新来的MVC和URL路由,并且正在寻找一些指导。ASP.NET MVC网址路由问题

我希望能有每个用户的URL,格式为: http://www.example.com/username

所以我增加了以下路线:

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

伟大的工程,如果它是第一路由,但它已经搞乱了默认的{controller}/{action}/{id}路线。现在,当我尝试访问根页面时,它会尝试使用null参数(或者以“favicon.ico”作为参数)加载我的UsersController“ViewUser”操作。

如果我在默认路由之后放置新路由,MVC会尝试找到名为username的控制器,并且因为无法找到它而失败。

有没有办法让表格{username}的网址没有堵塞常规路由系统?我可能可以为我拥有的每个控制器编写自定义路由,但似乎容易出错。

+0

你说得对,路由很容易出错。结账http://mvccoderouting.codeplex.com/如果你想完全忘记路由问题。 – 2011-03-11 13:23:57

回答

1

您可以检查出this link,看看是否有帮助。它也创建只有用户名的网址。

+0

这个解决方案(使用反射来查找所有其他控制器)奇怪的,但我想它应该工作。我想这个特殊的URL方案不是MVC团队预期的方案。 – 2011-03-10 21:27:59

1

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

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

当控制器不匹配任何那些会尝试下路线

+0

这可能会起作用,但它并不比单独列出每个控制器更好。我仍然必须记住列出每一个,我知道在一年之内,我会添加一个新的控制器,然后花一个小时与404战斗,然后再记得我使用的路由黑客。 – 2011-03-10 21:25:07

+0

@亨利,这是逻辑问题。既然你的路线满足根网址,你就是电脑了解要载入的内容?它只是使用第一个。你可以改变你的'UserRoute' url为''user/{username}''来解决它,但是这改变了你想要的url模式。 – 2011-03-10 23:58:55