我最近在现有的MVC 4网络应用程序中添加了区域 . 我的一个区域有一个Home控制器,所以很明显当我导航到 /MyArea/Home/Index 时我想显示它的索引视图 . 最初我收到以下错误:
找到了与名为“Home”的控制器匹配的多个类型 . 如果为此请求提供服务的路由(' / / ')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况 . 如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由 . 对'Home'的请求找到了以下匹配的控制器:MyApp.Controllers.HomeController MyApp.Areas.MyArea.Controllers.HomeController
研究这个问题我发现我需要在调用 MapRoutes() 时添加默认命名空间,这就停止了错误 . 不幸的是我现在发现,当我去 /MyArea/Home/Index 时,该应用实际上显示了 /Home/Index 的视图 - 我可以't display actions from the Area' s家庭控制器 .
这是我的代码:
Global.aspx.cs
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
MyApp.RouteConfig
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional},
namespaces: new[] {typeof(MyApp.Controllers.HomeController).Namespace}
);
}
MyApp.Areas.MyArea.MyAreaRegistration
public override void RegisterArea(AreaRegistrationContext context)
{
var ns = typeof(MyApp.Areas.MyArea.Controllers.HomeController).Namespace;
var routeName = AreaName + "_Route";
var routeUrl = AreaName + "/{controller}/{action}/{id}";
var routeDefaults = new {controller = "Home", action = "Index", id = UrlParameter.Optional};
var routeNamespaces = new[] {ns};
context.MapRoute(
name: routeName,
url: routeUrl,
defaults: routeDefaults,
namespaces: routeNamespaces
);
}
谁有任何关于如何解决这个问题的好主意?
Update:
只有在调用HomeController类(如Index)中存在的操作时才会出现此问题 . 在区域的HomeController中调用默认HomeController中不存在的操作会显示正确的视图 .
Update 2:
事实证明这是一个经典的PICNIC错误 - 我的代码中的一个简单错字,所以行动寻找一个不存在的视图 . 因此,它可以找到它可以找到的第一个匹配视图 - "root"中的一个
3 回答
当您链接到MyArea区域中的那个时,需要在routeValues参数中添加
new { Area = "MyArea" }
.在
RegisterArea
函数中,您应该更新routeDefaults
以包含区域名称 .<捂脸>
在导入区域代码的过程中,我在视图的文件夹名称中输入了一个拼写错误,因此MVC无法为区域操作找到正确的index.cshtml .
</捂脸>
从外观上看,当MVC无法找到区域操作的视图时,它会使用默认视图 . 一旦我修改了Areas \ MyArea \ Views中文件夹的名称以匹配控制器名称,一切都按预期工作 .
1回答的人 - 你的回答很有帮助,我已经在我的更新代码中使用了这两个