ASP.NET MVCアプリケーションで「!XXD3o!Multiple types were found that match the controller named 'Default'.」エラーが表示される現象について紹介します。
ASP.NET WVCアプリケーションでビューのURLにアクセスると、下記のエラーメッセージが表示されます。
同じ名称のコントローラーが複数存在するため、どちらのコントローラーにアクセスしてよいか判断がつかないため、上記のエラーが発生します。
ソリューションエクスプローラでエラーが発生するプロジェクトのファイルを確認します。
今回エラーが発生したプロジェクトのファイル構成を確認すると、エリアが定義されていない部分とエリアが定義されている部分(MyArea部分)で同じ名前のコントローラーが使われていることがわかります。
この状態で、MyAreaのMyArea/Default/Index
にアクセスするとView(ページ)が表示されます。
一方で エリア部分でないルート側のDefault/Index
にアクセスすると、Multiple types were found that match the controller named 'Default'.」
のエラーが表示されます。ルートからは、ルートのDeafaultControllerもMyArea内のDefaultControllerも参照可能であるため、どちらのコントローラーを利用すればよいか決定できないためエラーが発生します。
ルートからは、ルートのDeafaultControllerもMyArea内のDefaultControllerも参照できるため、ルーティングの指定でネームスペースを指定することで解決できます。
RouteConfig.cs または Global.asax ファイルのルーティングの設定部分(MapRouteメソッド呼び出し部分)の引数を変更します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace AspNetMvcAreaSameController
{
public class 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 }
);
}
}
}
MapRouteのnamespaces 引数にAspNetMvcAreaSameController.Controllers
を与えてエリア内のAspNetMvcAreaSameController.Areas.MyArea.Controllers
がルーティングの対象でないことを明示的に指定します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace AspNetMvcAreaSameController
{
public class 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[] { "AspNetMvcAreaSameController.Controllers" }
);
}
}
}
MyAreaのMyArea/Default/Index
にアクセスするとView(ページ)が表示されます。
ルートのDefault/Index
にアクセスした場合もエラーにならずView(ページ)が表示されます。
"Multiple types were found that match the controller named ..." エラーを解消することができました。