8

私のプロジェクトには2つの領域があります:

Areas | Admin
Areas | FrontEnd

私が望むのは、サイトにアクセスしたときに、デフォルトのルートがコントローラー/ビュー/モデルをそのFrontEndエリアからロードすることです。管理パネルには通常Url/Adminありますが、強制する必要はありませんUrl/FrontEnd(または他のバリエーション)。基本的に、ルート レベルで Controller / Model / View フォルダーを使用したくありません。

これを許可するようにコードを変更する方法がわかりません。または、それが推奨される方法でさえありません。誰かがガイダンスを提供してもらえますか?

私が持っているもの:

routes.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { 
                    area = "Admin",
                    controller = "Home", 
                    action = "Index", 
                    id = UrlParameter.Optional 
                },
                namespaces: new[] { "WebsiteEngine.Areas.Admin.Controllers" }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { 
                    area = "FrontEnd", 
                    controller = "Home", 
                    action = "Index", 
                    id = UrlParameter.Optional 
                },
                namespaces: new[] { "WebsiteEngine.Areas.FrontEnd.Controllers" }
            );

ただし、これによりエラーが発生します。

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml

私はその地域で利用可能なビューを持っていますが、これはそこにあるようには見えません。

4

1 に答える 1

10

次のようなことができると思います:

// Areas/Admin/AdminAreaRegistration.cs
public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "Admin"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            name: "Admin_Default", 
            url: "Admin/{controller}/{action}/{id}", 
            defaults: new 
            {
                area = "Admin",
                controller = "Home", 
                action = "Index", 
                id = UrlParameter.Optional 
            });
    }
}


// Areas/Admin/FrontEndAreaRegistration.cs
public class FrontEndAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get { return "FrontEnd"; }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            name: "FrontEnd_Default", 
            url: "{controller}/{action}/{id}", 
            defaults: new 
            {
                area = "FrontEnd",
                controller = "Home", 
                action = "Index", 
                id = UrlParameter.Optional 
           });
    }
}

// Global.asax.cs
protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    ...
}

さて、あなたのRouteConfigクラスでは、おそらくDefaultルートが設定されています。AreaRegistration.RegisterAllAreas に電話する前に電話する限りRouteConfig.RegisterRoutes、エリアで設定したルートが で設定したルートよりも優先される場合があることに注意してくださいRouteConfigRoutes(ルートはコレクションに表示される順序で評価され、.MapRoute新しいルートは最後までプッシュされます)

于 2013-09-26T21:41:35.210 に答える