web-dev-qa-db-ja.com

MVC3で、異なるエリアで同じコントローラー名を持つことは可能ですか?

MVC3には、次の領域があります。

  • モバイル
  • サンドボックス

次に、次のようにマップをルーティングします。

    context.MapRoute(
        "Sandbox_default",
        "Sandbox/{controller}/{action}/{id}",
        new { controller = "SandboxHome", action = "Index", id = UrlParameter.Optional }

そして

    context.MapRoute(
        "Mobile_default",
        "Mobile/{controller}/{action}/{id}",
        new { controller = "MobileHome", action = "Index", id = UrlParameter.Optional }
    );

問題は、これが次のようなURLを与えることです。

http:// localhost:58784/Mobile/MobileHome

そして

http:// localhost:58784/Sandbox/SandboxHome

しかし、私はそれをこのようにしたい:

http:// localhost:58784/Mobile/Home
http:// localhost:58784/Sandbox/Home

問題は、SandboxHome-Controllerの名前をHomeに、MobileHome-Controllerの名前をHomeに変更すると、目的のURLが得られ、HomeControllerのクラスが2つあると言ってコンパイルされないことです。

異なる領域で同じコントローラー名を使用するにはどうすればよいですか?

28
Stefan Steiger

はい。

このブログ投稿で説明されているように: http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx

VisualStudioによって生成されたRegisterAllAreasおよびAreaRegistrationファイルへの呼び出しがあると仮定します。競合を防ぐために必要なのは、グローバルASAXのデフォルトルート上の名前空間だけです。

//Map routes for the main site. This specifies a namespace so that areas can have controllers with the same name
routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new[]{"MyProject.Web.Controllers"}
 );

Areaコントローラーを独自の名前空間内に保持している限り。これは機能します。

41

はい、そうですが、ルーティングを変更する必要があります。

_context.MapRoute(
    "Default",
    "{area}/{controller}/{action}/{id}",
    new { area = "Mobile", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
_

両方のルートを保持することもできますが、デフォルトでareaを定義することを忘れないでください。

重要

もちろん、コントローラーを独自のエリア名前空間に保持する必要があります。

_namespace MyApp.Areas.Mobile.Controllers
{
    public class HomeController : Controller
    {
        ...
    }
}

namespace MyApp.Areas.Sandbox.Controllers
{
    public class HomeController : Controller
    {
        ...
    }
}
_

MSDNのこのリンク を確認し、チュートリアルを参照してください。また、RegisterAllAreas()メソッドを呼び出す必要があるため、エリア登録について説明している このMSDN記事 も確認することを忘れないでください。

そして、あなたはまだ元の非エリアコントローラーを保持したいので、これも読む必要があります Phil Haackの記事 それを行う方法(クレジットは最初にこのブログ投稿を指すために彼の答えで@Robに行くべきです)。

4
Robert Koritnik