【发布时间】:2012-04-05 12:48:04
【问题描述】:
很抱歉问了一个很n00b 的问题,我对 ASP.NET MVC 很陌生。 我的问题如下:
我希望我的网站按以下方式处理 URL:
www.mysite.com/homepage/name
我希望上面的链接转到该用户的个人资料。为简单起见,控制器将是带有 Test 操作的 Homepage 控制器。
意味着 global.asax 路由将是:
routes.MapRoute(
"test",
"homepage/{name}",
new { controller = "Homepage", action = "Test" }
);
到目前为止,代码运行良好(我已经对其进行了测试,并且可以正常运行)。
但现在我想要启用的其他功能是:
www.mysite.com/homepage/action/id
工作也是如此。
此路由将是:
routes.MapRoute(
"Default",
"homepage/{action}/{id}",
new { controller = "Homepage", action = "Index", id = UrlParameter.Optional }
);
问题是当用户想要为某个操作省略 {id} 时会发生什么,路由表检测到该操作名称实际上是 {name} 参数。
有没有办法先检查一个动作是否存在。并且只有在没有的情况下,才将其用作不同路由的参数。
有意义吗?如果没有,我会添加更多细节。
谢谢!
编辑
所以我已经设法使用约束正则表达式解决了这个问题 我在我的控制器中放置了一个定义所有动作的正则表达式:
routes.MapRoute(
"homepage",
"homepage/{action}/{id}",
new { controller = "Homepage", action = "Index", id = UrlParameter.Optional },
new { action = "(action1|action2|action3)" }
);
然后是下一条规则:
routes.MapRoute(
"feed",
"homepage/{id}",
new { controller = "Homepage", action = "Test"}
);
我工作正常,只是很难在此基础上进行扩展。您需要记住将控制器上的每个新操作都放在此处的字符串中。这是调试噩梦的巨大机会。
谢谢!
【问题讨论】:
-
如果用户创建了一个名为 Index 的帐户,或者您的操作名称是什么?
-
我猜这一切都需要与数据库管理同步。这是一个很好的问题。我们这样做的方式是自己生成这些 slug,因此我们有权保留一些字符串。
-
我想我的观点是,通过使用不同的路径来设计东西真的更好,这样就不会发生这样的混乱。
标签: asp.net asp.net-mvc-3