3

很抱歉问了一个相当 n00b 的问题,我对 ASP.NET MVC 很陌生。我的问题如下:

我希望我的网站以下列方式处理 URL:

www.mysite.com/homepage/name

我希望上面的链接转到该用户的个人资料。为简单起见,控制器将是具有测试操作的主页控制器。

这意味着 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"}
            );

我工作正常,只是很难扩大规模。您需要记住将控制器上的每个新操作都放在此处的字符串中。这是调试噩梦的一个巨大开口。

谢谢 !

4

2 回答 2

1

由于 ASP.NET MVC 从RouteTable与当前请求匹配的第一个路由中选择,您应该能够通过更改 Global.asax 中路由的顺序来解决此问题。

首先这个:

routes.MapRoute(
            "Default",
            "homepage/{action}/{id}",
            new { controller = "Homepage", action = "Index", id = UrlParameter.Optional }
        );

然后这个:

routes.MapRoute(
            "test",
            "homepage/{name}",
            new { controller = "Homepage", action = "Test" }
            );

希望这可以帮助。

于 2012-04-05T13:03:53.617 回答
0

您需要先放置Default路线,并限制其允许的值

routes.MapRoute(
            "Default",
            "homepage/{action}/{id}",
            new { controller = "Homepage", action = "Index", id = UrlParameter.Optional },
            new {action = @"Index|Delete|Add"}
        );

routes.MapRoute(
            "test",
            "homepage/{name}",
            new { controller = "Homepage", action = "Test" }
            );

这样,只有当动作值与约束中提供的值匹配时才会使用第一个路由,否则它将移动到下一个规则。

您还必须确保在创建用户配置文件时,任何名称都不应与您支持的default路线操作之一相匹配。

于 2012-04-05T13:14:38.213 回答