3

2つのドメインにサービスを提供するように設計されたMVC4アプリケーションに取り組んでいます。ほとんどのコンテンツはドメイン間で共有されますが、リクエストの送信元のサイトに応じて、(Razorを使用して)異なるマークアップをレンダリングする必要がある場合があります。

理想的には、次のようなフォルダ構造を持つことができるコンベンションベースのアプローチが必要です。

Views
+ Domain1
    + ControllerName
        View1
        View2
+ Domain2
    + ControllerName
        View1
+ ControllerName
   View1
   View2

ビューを解決するときは、最初にドメイン固有のフォルダーを確認し、次に一般的なビューフォルダーを確認したいと思います。

私が最初に考えたのは、リクエストドメインに応じてViewLocationFormats文字列を交換するRazorViewEngineを継承するカスタムビューエンジンを実装することでした。残念ながら、これらすべてのものはVirtualPathProviderEngineに埋め込まれており、オーバーライドすることはできません。

4

1 に答える 1

9

答えは、ドメイン固有のフォルダーを認識しているドメインごとにカスタムビューエンジン(RazorViewEngineから継承)を作成することでした。

public class Domain1ViewEngine() : RazorViewEngine
{
        ...

        ViewLocationFormats = new[]
        {
            "~/Views/Domain1/{1}/{0}.cshtml",
            "~/Views/Domain1/Shared/{0}.cshtml"
        };

        ...
}

次に、リクエストが正しいドメインからのものである場合にのみロケートビューを見つけようとするように、メソッドFindViewとメソッドをオーバーライドする必要がありました。FindPartialView

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
    if ([THIS IS NOT THE RIGHT DOMAIN]) 
    {
        return new ViewEngineResult(new string[] { });
    }

    return base.FindView(controllerContext, viewName, masterName, useCache);
}

プロセスを完了するためGlobal.asax.csに、通常の方法でビューエンジンを登録しました。

protected void Application_Start()
{
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new Domain1ViewEngine());
    ViewEngines.Engines.Add(new RazorViewEngine());
}
于 2012-12-12T16:40:08.433 に答える