【发布时间】:2016-10-18 13:43:35
【问题描述】:
我最近向现有的 MVC 4 Web 应用程序添加了区域。我的一个区域有一个 Home 控制器,所以很明显,当我导航到 /MyArea/Home/Index 时,我想显示它的 Index 视图。最初我收到以下错误:
找到了与名为“Home”的控制器匹配的多种类型。如果为该请求提供服务的路由 ('{controller}/{action}/{id}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用带有“namespaces”参数的“MapRoute”方法的重载来注册此路由。
“主页”请求找到了以下匹配的控制器: MyApp.Controllers.HomeController MyApp.Areas.MyArea.Controllers.HomeController
研究该问题后,我发现我需要将默认命名空间添加到对 MapRoutes() 的调用中,这样就停止了错误。不幸的是,我现在发现当我转到 /MyArea/Home/Index 时,该应用实际上显示了 /Home/Index 的视图 - 我无法显示来自区域的 Home 控制器。
这是我的代码:
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
);
}
有人对如何解决这个问题有任何好的想法吗?
更新:
该问题仅在调用两个 HomeController 类中存在的操作时才会出现,例如 Index。在区域的 HomeController 中调用默认 HomeController 中不存在的操作会显示正确的视图。
更新 2:
原来这是一个经典的PICNIC 错误——我的代码中有一个简单的错字,所以该操作开始寻找一个不存在的视图。因此,它选择了它可以找到的第一个匹配视图 - “根”中的那个
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-routing