ASP.NET MVC 3删除/ Home

时间:2011-09-02 22:36:33

标签: asp.net-mvc asp.net-mvc-3

我在Visual Web Developer 2010 Express中创建了一个新的ASP.NET MVC 3 Internet应用程序,我注意到使用此默认模板,路径localhost:port/Home显示与localhost:port/相同的内容

有没有办法删除/Home?我只希望localhost:port/成为目标网页。

2 个答案:

答案 0 :(得分:3)

两个网址都有效,因为这是在Global.asax中定义默认路由的方式:

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

这意味着//Home/Home/Index的所有内容都会落入HomeController/Index行动。因此,事实上,当您请求/时,执行的操作完全相同。

您可以像这样修改它:

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

当然,通过这样做,您将能够在应用程序中运行的唯一控制器和操作将是HomeController和Index操作。由于您未在URL中提供任何指定它们的方法,因此无法访问任何其他操作或控制器。所以我会保留默认路由,因为它们允许处理99%的情况,除非你有一些特定的要求。

答案 1 :(得分:3)

其他人都是对的。然而,他们并没有真正告诉你一个方法。更好地控制路线的一种方法如下

在注册路线方法

中执行以下操作
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        var controllers = typeof(MvcApplication).Assembly.GetTypes().Where(t => !t.IsAbstract && t.Navigate(_ => _.BaseType).Any(_ => _ == typeof(Controller)));
        foreach (var controller in controllers)
        {
            var actions = controller.GetMethods().Where(m => m.HasAttribute<RouteAttribute>()).Select(m => new { Method = m, Attribute = m.GetAttribute<RouteAttribute>() }).ToArray();
            foreach (var action in actions.OrderBy(m => m.Attribute.Path.Count(c => c == '{')))
                routes.MapRoute(string.Format("{0}.{1}", controller.Name, action.Method.Name), action.Attribute.Path.TrimStart('/'), new { controller = controller.Name.Replace("Controller", ""), action = action.Method.Name });
        }

然后使用route属性修饰控制器方法,该属性确切地定义了路由应该是什么。你必须自己创建route属性,它只是一个带有字符串参数的属性。通过这种方式,您可以将任何控制器方法设置为您喜欢的任何路径。