1

2 つのマスター ページがあります。1 つは、通常のスタンドアロン Web サイトに表示されることを目的としています。もう 1 つは、外部サイトで Iframe として使用されます。

http://example.com/home/indexで通常のページを表示し、 http : //example.com/framed/home/index で iframe バージョンを表示できるようにしたい

ロジックを複製する必要がないように、1 つのコントローラーにポストバックするコントロールが必要なため、通常バージョンと iframe バージョンの両方で使用できる必要があります。

私の問題は、エリアを使用しようとすると、デフォルトの URL で正しく動作させることができないことです。また、構造マップの複雑さが追加されました。/area/controller/action を押してみると、

IControllerFactory 'MySite.Web.Code.IoC.StructureMapControllerFactory' は、'MyArea' という名前のコントローラーを返しませんでした。

この種のセットアップを機能させる方法を知っている人はいますか? 実際に私が行っているのは、/Framed/controller/action がある場合は 1 つのビュー セットを表示し、/framed がない場合は別のビュー セットを表示しようとすることだけです。エリアは行くべき道だと思っていましたが、そうではないかもしれません。

4

1 に答える 1

1

すべてのコントローラーは同じ基本クラスを実装し、次のオーバーライドを使用して、説明していることを実行します。

protected override ViewResult View(string viewName, string masterName, object model)
{
    if (masterName == null)
    {
        var options = PortalRequestManager.CurrentPortalRouteOptions;
        masterName = options.MvcMasterPath;
    }
    return base.View(viewName, masterName, model);
}

すべての AreaRegistrations は、次のメソッドを使用してそのエリアを登録します。

    public static void RegisterMvcAreaRoutes(AreaRegistrationContext context, string name, string url,
                                             object defaults)
    {
        context.MapRoute(name + "Portal",
                         "P/Channel/" + url,
                         defaults);
        context.MapRoute(name + "FramePortal",
                         "F/Channel/" + url,
                         defaults);
    }

次に、最初のコード ブロックで見た PortalRequestManager が URL を解析して、"/P" または "/F" を使用するかどうかを確認し、使用する MvcMasterPath を決定します。

このセットアップでは問題のない Ninject のコントローラー ファクトリを使用しているため、StructureMap に関する問題について実際に話すことはできません。

于 2010-10-14T19:21:39.167 に答える