ASP.NET MVC 4:将Index保持为默认视图

时间:2013-09-07 01:33:43

标签: c# asp.net asp.net-mvc asp.net-mvc-4

默认情况下,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

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

有没有办法配置启动页面“SomeController \ MyAction”这样; root URL始终指向它,Index是每个控制器的默认视图吗?

相当于Ruby on Rails路线的东西:

root :to => "some_controller#my_action"

保持默认视图绑定到index操作。

2 个答案:

答案 0 :(得分:4)

您需要在默认路由之前为Site root添加额外路由:

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"的其他路线轻松更改。

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

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

答案 1 :(得分:2)

听起来你想要这个:

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 }   
);

ASP.NET Web API的默认路由如下:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);