Asp.net mvc 2 如何配置global.config以允许MVC2中actionMethod的根路径?

Asp.net mvc 2 如何配置global.config以允许MVC2中actionMethod的根路径?,asp.net-mvc-2,Asp.net Mvc 2,具体来说,默认的目录命名结构是[Controller]/[ActionMethod],从而生成一个呈现的url,如www.mysite.com/home/actionMethodName 如果我想在这个例子中简单地暗示控制器“home”,这样我就可以得到一个如下的url:www.mysite.com/actionMethodName 我还没有看到很多关于这种配置的请求。我可以看出它是如何打破惯例的,但我可以想象,有很多人需要根路径。就像苹果派一样简单-你只需指定自己的路径= 例如: routes

具体来说,默认的目录命名结构是[Controller]/[ActionMethod],从而生成一个呈现的url,如www.mysite.com/home/actionMethodName

如果我想在这个例子中简单地暗示控制器“home”,这样我就可以得到一个如下的url:www.mysite.com/actionMethodName


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

就像苹果派一样简单-你只需指定自己的路径=

例如:

routes.MapRoute(
    "RootPathing",
    "{action}",
    new { controller = "Default", action = "Index" });
这将注册捕获所有路径的路由,并尝试使用与路径对应的操作名称将它们映射到DefaultController。但是,请注意,如果将此路由放置在包含的默认路由之上,则将无法到达除DefaultController之外的任何其他控制器-因此,将此路由放置在链中的默认路由之下。然后,它将被与控制器名称不匹配的所有路径匹配。
调试路由时,确实值得一看。

非常简单-您只需指定自己的路由即可=

例如:

routes.MapRoute(
    "RootPathing",
    "{action}",
    new { controller = "Default", action = "Index" });
这将注册捕获所有路径的路由,并尝试使用与路径对应的操作名称将它们映射到DefaultController。但是,请注意,如果将此路由放置在包含的默认路由之上,则将无法到达除DefaultController之外的任何其他控制器-因此,将此路由放置在链中的默认路由之下。然后,它将被与控制器名称不匹配的所有路径匹配。
调试路由时,确实值得一看。

因为您计划删除url的{controller}元素,您可能需要对其他url进行更具体的处理,例如:

routes.MapRoute("MyOtherControllerRoute", "Account/{action}", new { controller = "Account", action = "Index" });
routes.MapRoute("MyDefaultRoute", "{action}", new { controller = "Home", action = "Index" });
当查询路由表时,如果使用诸如www.mysite.com/Account之类的url,它将匹配第一条路由,因为我们已经明确了用于匹配url的模式。如果我们随后执行类似www.mysite.com/DoSomething的操作,它将使用我们上次选择的默认路由,尝试调用HomeController类型上的DoSomething操作

我注意到,许多MVC开发人员似乎认为url严格地说是{Something}/{Something}/{Something}/{Something},而实际上它可以是您喜欢的任何东西,例如,我可以有一个路径:www.mysite.com/my-weird-and-wonder-url,我可以具体映射:

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

希望对您有所帮助。

因为您计划删除url的{controller}元素,您可能需要对其他url进行更具体的处理,例如:

routes.MapRoute("MyOtherControllerRoute", "Account/{action}", new { controller = "Account", action = "Index" });
routes.MapRoute("MyDefaultRoute", "{action}", new { controller = "Home", action = "Index" });
当查询路由表时,如果使用诸如www.mysite.com/Account之类的url,它将匹配第一条路由,因为我们已经明确了用于匹配url的模式。如果我们随后执行类似www.mysite.com/DoSomething的操作,它将使用我们上次选择的默认路由,尝试调用HomeController类型上的DoSomething操作

我注意到,许多MVC开发人员似乎认为url严格地说是{Something}/{Something}/{Something}/{Something},而实际上它可以是您喜欢的任何东西,例如,我可以有一个路径:www.mysite.com/my-weird-and-wonder-url,我可以具体映射:

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

希望这会有所帮助。

我现在没有时间确认这一点,但我很确定这将失败,因为url将与默认路由匹配,如果您在该路由上有url,它几乎匹配所有内容。这将抛出一个异常,说明它找不到控制器。相反,您可以在此之前添加更多特定的路由,以确保它们与此路由应匹配的URL不匹配。@Mattias:可能是这样。我现在也不能测试它,但是这种情况下的解决方案是为每个控制器添加一个特定的路由,为HomeController添加模式~/Home/{action},等等,所以很容易修复。这是一个你无法真正避免的问题——如果你想在路由路径上选择一个动作,那么在任何路由上都不能太笼统;这是路由概念的局限,而不是MVC框架的局限。@Tomas Lycken,是的,当然。您还可以实现自己的路由类,检查url是否为有效操作,然后将其首先添加到路由列表中。但是在这种情况下,最好先编写更具体的路由。是的,将初始解决方案添加到Global.config会产生以下错误:路由URL不能以“/”或“~”字符开头,并且不能包含“?”字符。参数名称:routeUrl@Neurothustra,只需从路由中删除~/就可以了。我现在没有时间确认这一点,但我很确定这将失败,因为url将与默认路由匹配,如果您在该路由上有url,它几乎匹配所有内容。这会让你痛苦
出现异常,表示找不到控制器。相反,您可以在此之前添加更多特定的路由,以确保它们与此路由应匹配的URL不匹配。@Mattias:可能是这样。我现在也不能测试它,但是这种情况下的解决方案是为每个控制器添加一个特定的路由,为HomeController添加模式~/Home/{action},等等,所以很容易修复。这是一个你无法真正避免的问题——如果你想在路由路径上选择一个动作,那么在任何路由上都不能太笼统;这是路由概念的局限,而不是MVC框架的局限。@Tomas Lycken,是的,当然。您还可以实现自己的路由类,检查url是否为有效操作,然后将其首先添加到路由列表中。但是在这种情况下,最好先编写更具体的路由。是的,将初始解决方案添加到Global.config会产生以下错误:路由URL不能以“/”或“~”字符开头,并且不能包含“?”字符。参数名称:routeUrl@Neurothustra,只需将~/从路线上移除,它就会工作。谢谢Matthew-这很好。感谢所有提供见解的人——我很高兴能很快找到解决方案。谢谢马修——效果很好。感谢所有提供见解的人——我很高兴能很快找到解决方案。