ASP.NET MVC中的模糊控制器名称

时间:2009-01-16 20:20:00

标签: asp.net-mvc

我尝试在我的项目http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx中实施Phil的区域演示。 我在现有的MVC项目中添加了区域/博客结构,我的项目中出现以下错误。

以下类型之间的控制器名称“Home”不明确: WebMVC.Controllers.HomeController WebMVC.Areas.Blogs.Controllers.HomeController

这就是我的global.asax看起来的样子。

public static void RegisterRoutes(RouteCollection路由)         {             routes.IgnoreRoute( “{}资源个.axd / {*} PATHINFO”);

        routes.MapAreas("{controller}/{action}/{id}",
            "WebMVC.Areas.Blogs",
            new[] { "Blogs", "Forums" });

        routes.MapRootArea("{controller}/{action}/{id}",
            "WebMVC",
            new { controller = "Home", action = "Index", id = "" });

        //routes.MapRoute(
        //    "Default",   // Route name
        //    "{controller}/{action}/{id}",// URL with parameters
        //    new { controller = "Home", action = "Index", id = "" }  
        //            // Parameter defaults
        //);

    }

    protected void Application_Start()
    {
        String assemblyName = Assembly.GetExecutingAssembly().CodeBase;
        String path = new Uri(assemblyName).LocalPath;
        Directory.SetCurrentDirectory(Path.GetDirectoryName(path));
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new AreaViewEngine());
                  RegisterRoutes(RouteTable.Routes);
       // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

    }

如果我从routes.MapAreas中删除/ Areas / Blogs,它会查看根目录的索引。

3 个答案:

答案 0 :(得分:2)

在ASP.NET MVC 2.0中,您可以在父区域中注册路由时包含父项目控制器的名称空间。

routes.MapRoute(
    "Default",                                             
    "{controller}/{action}/{id}",                          
    new { controller = "Home", action = "Index", id = "" },
    new string[] { "MyProjectName.Controllers" }
);

这限制了仅在您指定的命名空间中搜索控制器的路由。

答案 1 :(得分:1)

使用WebMVC.Areas.Blogs和WebMVC.Areas.OtherAreaName而不是WebMVC.Areas.Blogs和WebMVC。将区域名称视为命名空间根,而不是绝对命名空间。

答案 2 :(得分:0)

您可以在路由中使用相同名称的多个控制器之间进行优先级排序,如下所示

例如,我在Areas/Admin/HomeController中有一个名为HomeController的控制器     另一个在根/controller/HomeController中     所以我按如下方式优先考虑我的根目录:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", // Parameter defaults
    id = UrlParameter.Optional },
    new [] { "MyAppName.Controllers" } // Prioritized namespace which tells the current asp.net mvc pipeline to route for root controller not in areas.
);