1

私は MVC 3 と MVC Contrib を使用してポータブル領域を作成しています。問題は、ポータブル領域が同様のビュー (ホーム、ユーザー管理など) を持っていることです。

たとえば、各ポータブル領域には、ホーム ビュー (Views/Home/Index.cshtml) とホーム コントローラー (Controllers/Home.cs) があります。ページにアクセスするには、MySite/PortableAreaName/Controller/View に移動するようにルーティングが設定されています。

問題は、最初のポータブル エリアのホーム ページとユーザー管理ページしか読み込まないことです。最初にそのビューを見つけてから、URL で指定された領域に関係なくロードします。

すべてにプレフィックスを付けることもできますが (例: Area1Home、Area1UserManagement)、よりスケーラブルなソリューションを見つけたいと思います。それぞれ 10 個のビューを持つ 50 個以上のポータブル エリアを取得した場合、どのビュー名を使用したかを追跡するか、すべてのビューにプレフィックスを付ける必要があります。

助言がありますか?さらに情報が必要な場合は、お知らせください。

更新 1 - 機能しませんでした

twang が提供する記事を使用して解決し、次のコードをメイン プロジェクト (リンクされた記事の「PortableAreas」) に追加します。

記事: http://elegantcode.com/2012/04/06/mvc-portable-areas/

メイン プロジェクト > Global.asax.cs

protected void Application_Start()
{
    // ...
    AreaRegistration.RegisterAllAreas();
    PortableAreaRegistration.RegisterEmbeddedViewEngine();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    // ...
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Login", action = "Index", id = UrlParameter.Optional },
        new string[] { "PortableAreas.Controllers" } // main project namespace
    );
}

ポータブル エリア > MyPortableAreaRegistration.cs

public class MyPortableAreaRegistration : PortableAreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "MyPortableArea";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
    {
        RegisterRoutes(context);
        RegisterAreaEmbeddedResources();
    }

    private void RegisterRoutes(AreaRegistrationContext context)
    {
        context.MapRoute(
            AreaName + "_default",
            base.AreaRoutePrefix + "/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new[] { "MyPortableArea.Controllers", "MvcContrib" }
        );
    }
}

私が理解している限り、次の場所がリソースのデフォルトです。

  • マイポータブルエリア/コンテンツ/画像
  • MyPortableArea/スクリプト

これらのフォルダーにリソースを保持している限り、それらを登録するべきではありません。

更新 2

以前の修正は機能しませんでした。上記のコードを使用しても、間違ったビューやリソースなどが読み込まれることがあります。これを修正する方法を知っている人はいますか?

デバッグすると、正しいコントローラーとそのコントローラー内の正しいビューに移動しますが、間違ったビューをロードします (たとえば、Area2 のコントローラーと Area2 の Home page メソッドになりますが、Area1 のホームページをロードします。

たとえば、2 つのポータブル領域がありますが、常に最初の領域が読み込まれます

MyPortableArea1/Controls/Home, MyPortableArea1/Scripts/Views/Home/index.js MyPortableArea2/Controls/Home, MyPortableArea2/Scripts/Views/Home/index.js

一度に全部登録するからだと思いますか?次に、ルートの一致が見つかると、最初の一致が使用されます (これは間違っている場合があります)。

アップデート 3

コードをステップ実行した後、レイアウトのセクションが正しく読み込まれていないようです。たとえば、MyPortableArea2 の HomeController > Index() に到達し、レイアウトをロードしてから、レイアウトは @RenderBody() セクションで MyPortableArea1 のコンテンツをロードします。

更新 4

http://mvccontrib.codeplex.com/から最新バージョンの MvcContrib に更新されました。これはうまくいきませんでした。

更新 5

だから私は少しテストを行い、間違ったページをロードする理由を突き止めました.Areaがまったく見つかりません. それはシステムにもないようです!

例: PortableArea1/Home/Index

public ActionResult Index()
{
    return View("~/Areas/PortableArea1/Views/Home/Index.cshtml");
}

例: PortableArea2/Home/Index

public ActionResult Index()
{
    return View("~/Areas/PortableArea2/Views/Home/Index.cshtml");
}

間違ったページをロードすると、ビューが見つからないというエラーが表示されるようになりました。ポータブルエリアをロードしないのはなぜですか??

4

2 に答える 2

3

RegisterAreas() をオーバーライドし、各エリアに RegisterRoutes() を実装することができます。

ここに良い記事があります: http://elegantcode.com/2012/04/06/mvc-portable-areas/

それが役に立てば幸い。

于 2012-10-30T04:46:00.630 に答える
0

これはおそらくエリアの_ViewStart.cshtmlファイルの結果です。これは、単一のディレクティブを含むあまり知られていないファイルです。

@{
 Layout = "~/someurl";
}

これにより、その領域内のすべてのビューに対してベース ページが読み込まれる場所が定義されます。ファイルは、その領域のファイルと同じスコープにありweb.configます。

于 2012-12-10T22:37:05.040 に答える