私は MVC3 にかなり慣れていませんが、これを調査してテストするのにかなりの時間を費やしましたが、解決策が見つかりません。Stack に別の同様の投稿がありますが、7 か月経っても回答がありません。
核心はこれです: エリアとコントローラーの名前が重複していても問題ありません。エリアがあり、HyphenatedRouteHandler を使用している場合 - 問題ありません。エリア、重複するコントローラー名、およびハイフンでつながれたルート ハンドラーを使用しようとすると、次のエラーが発生します。
「製品」という名前のコントローラーに一致する複数のタイプが見つかりました。これは、このリクエスト ('{controller}/{action}/{id}') を処理するルートが、リクエストに一致するコントローラーを検索するための名前空間を指定していない場合に発生する可能性があります。この場合は、'namespaces' パラメーターを取る 'MapRoute' メソッドのオーバーロードを呼び出して、このルートを登録します。
また、ルートコントローラーでエラーが発生していますが、エリア内のコントローラーではエラーが発生していません。たとえば、/products は機能しませんが、/admin/products は機能します。
具体的な解決策に永遠に感謝します!! コードは次のようになります。
Global.asax
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var route = routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "MyProject.Controllers" }
);
route.RouteHandler = new HyphenatedRouteHandler();
}
と:
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
AdminAreaRegistration.cs
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}