3

默认情况下,MVC 4 应用程序具有以下路由ProjectFolder\App_Start\RoutConfig.cs

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }   
);

在浏览器中,任何调用http://host:port/controller/都会将您带到http://host:port/controller/Index.

现在,如果您想更改起始页,可以说SomeController\MyAction,您可以将其更改为:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "SomeController", action = "MyAction", id = UrlParameter.Optional }   
);

但随后http://host:port/controller/不会显示http://host:port/controller/Index,而是显示 404 错误页面。您需要/Index在 URL 中显式附加。

如果您从项目属性更改启动页面并将路由保留到 Home\Index,那么一切都会正常工作,除了 URL 根目录http://host:port/不会显示启动页面。当您运行应用程序时,它将在 URL 中附加启动页面名称。但是,如果您<a href="/" title="home">Home</a>在应用程序中的某处有相对超链接,它不会带您到所需的主页

有没有办法配置启动页面“SomeController\MyAction”;根 URL 总是指向它并且Index是每个控制器的默认视图?

相当于 Ruby on Rails 的路线:

root :to => "some_controller#my_action"

它将默认视图绑定到index操作。

4

2 回答 2

4

您需要在默认路由之前为站点根目录添加额外的路由:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(name: "SiteRoot", url: "",
                    defaults: new { controller = "SiteRoot", action = "Main" });

    routes.MapRoute(name:"Default", url:"{controller}/{action}/{id}",
                    defaults:new {controller = "Home", action = "Index", id = UrlParameter.Optional});
}

现在"/"带你去SiteRoot/Main,一会儿"/Home"带你去Home/Index

注意在这种情况下"/SiteRoot"也会带你去"SiteRoot/Index",而不是去"SiteRoot/Main"。这可以通过特定于url: "/SiteRoot".

此外,如果您想更加精确,可以在默认路线中删除 part controller = "Home",因为第一条路线现在涵盖了这种情况。但是,保留默认路由也可以。

routes.MapRoute(name:"Default", url:"{controller}/{action}/{id}",
                defaults:new { action = "Index", id = UrlParameter.Optional});
于 2013-09-07T07:07:55.300 回答
2

It sounds like you want this:

routes.MapRoute(
    name: "SomeController Default",
    url: "SomeController/{action}/{id}",
    defaults: new { action = "Index", id = UrlParameter.Optional }   
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }   
);

This is the how the default routing for ASP.NET Web API works, like this:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
于 2013-09-07T02:08:18.220 回答