2010-07-28 33 views
1

具体而言,默认的目录命名结构是[控制器]/[ActionMethod]导致像www.mysite.com/home/actionMethodName渲染网址。我将如何配置global.config以允许MVC2中的actionMethod根路径?

如果我想简单地意味着控制器(在这个例子中,“家”),这样我就可以得到一个URL,看起来像这样:www.mysite.com/actionMethodName。

我还没有看到这种配置的许多要求。我可以看到它如何打破惯例,但我会想象有很多人需要根路径。

回答

2

因为你打算删除网址的{控制器}元素,你可能需要获得更具体一点与其他的网址,如:

routes.MapRoute("MyOtherControllerRoute", "Account/{action}", new { controller = "Account", action = "Index" }); 
routes.MapRoute("MyDefaultRoute", "{action}", new { controller = "Home", action = "Index" }); 

当路由表进行询问,如果使用的网址如www.mysite.com/Account,它会匹配第一条路由,因为我们已经详细说明了用于匹配url的模式。如果我们然后执行类似www.mysite.com/DoSomething的操作,它将使用我们上次选择的默认路由,尝试调用HomeController类型的DoSomething操作。

我注意到的一点是,很多MVC开发者似乎认为url是严格的{something}/{something}/{something},而它基本上可以是任何你喜欢的东西,例如,我可以有一条路线:www.mysite.com/my-weird-and-wonderful-url我可以专门映射:

routes.MapRoute("Somewhere", "my-weird-and-wonderful-url", new { controller = "Whatever", action = "Whenever" }); 

希望有所帮助。

+0

感谢马修 - 工作得很好。提供了他们的见解 - 我很高兴迅速提供了一个解决方案。 – Neurothustra 2010-07-28 15:44:04

2

易苹果派 - 你只需指定自己的路线! =)

一个例子:

routes.MapRoute(
    "RootPathing", 
    "{action}", 
    new { controller = "Default", action = "Index" }); 

这将注册映入的所有路径的路径,并尝试将其与对应于该路径的动作名称映射到DefaultController。但是,请注意,如果您将包含默认路由上面的这条路线,你将不能够比DefaultController达成任何其他控制器 - 因此,把这个路径下面链中的缺省路由。然后它将被与控制器名称不匹配的所有路径匹配。 调试路线时,Phil Haack's Routing Debugger真的值得一看。

+0

我没有时间,现在证实这一点,但我敢肯定的是作为URL将被默认路由相匹配,这将失败(这几乎一切比赛),如果你有这条路线之上。这会抛出一个异常,说它找不到控制器。相反,您可以在此之前添加更具体的路线,以确保它们不匹配此路线应匹配的路径。 – 2010-07-28 14:49:44

+0

@Mattias:那可能是真的。我现在也不能测试它,但是这种情况下的解决方案是为每个控制器添加一个特定的路由,使用“HomeController”的''〜/ Home/{action}''等模式,所以它是很容易修复。这是一个你无法避免的问题 - 如果你想能够在路径路径上选择一个动作,你不能在任何路线上过于通用;这是路由概念的限制,而不是MVC框架的限制。 – 2010-07-28 14:56:25

+0

@Tomas Lycken,当然可以。你也可以实现自己的路由类,并检查url是否是有效的动作,然后在路由列表中首先添加。但是在这种情况下,它可能更适合以前编写更具体的路线。 – 2010-07-28 15:00:44