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/Home
http:// localhost:58784/Sandbox/Home
問題は、SandboxHome-Controllerの名前をHomeに、MobileHome-Controllerの名前をHomeに変更すると、目的のURLが得られ、HomeControllerのクラスが2つあると言ってコンパイルされないことです。
異なる領域で同じコントローラー名を使用するにはどうすればよいですか?
はい。
このブログ投稿で説明されているように: 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コントローラーを独自の名前空間内に保持している限り。これは機能します。
はい、そうですが、ルーティングを変更する必要があります。
_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に行くべきです)。