English 中文(简体)
ASP.NET MVC中的模棱两可的控制器名称
原标题:
  • 时间:2009-01-16 20:20:00
  •  标签:

我尝试在我的项目中实现Phil的区域演示。

将此翻译成中文:http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx

我在现有的MVC项目中追加了Areas/Blog结构,并在我的项目中遇到了以下错误。

控制器名称 Home 在以下类型之间存在歧义:

WebMVC.Controllers.HomeController
WebMVC.Areas.Blogs.Controllers.HomeController 

这就是我的Global.asax外观。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.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,它会查看根目录的Index。

问题回答

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

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

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

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

您可以按照以下方式在路由中对具有相同名称的多个控制器进行优先级排序

E.g., I have one controller named HomeController in Areas/Admin/HomeController and another in root /controller/HomeController
so I prioritize my root one as follows:

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




相关问题