2011-02-03 6 views
4

私はMVCをページを生成するためのメインエンジンとして使用しているCMSを書いています。ViewディレクトリにMVCビューが存在する必要があるのはなぜですか?

私はうまくいっていますが、必要に応じてサイトごと、場合によってはビューごとに独自のカミソリテンプレートを作成する機能が必要でした。

各プロジェクトでは、URLにリンクされた一意のコードが必要です。

各プロジェクトサイトの資産は、プロジェクトに関連する場所に格納されます。

したがって、プロジェクトC0001に関連付けられた資産は、assets\C0001\に格納され、C0002:assets\C0002\などに格納されます。

私がやりたかったことは、ちょっとしたことを保つために、assets\[ProjectCode]にあるプロジェクトに関連付けられたカミソリテンプレートを持たせることでしたが、問題はViewBag not existing in contextについてのエラーです。

だから、これは動作しません:それは外既知のであるので、私は最初のレイアウトは、レンダリングのdoesnt推測してい

Layout = string.Concat("~/Views/Shared/_",ViewBag.ProjectNumber,"Layout.cshtml"); 

:次のページをレンダリングするよう

Layout = string.Concat("~/assets/",ViewBag.ProjectNumber,"/_Layout.cshtml"); 

ビューの検索エリア?しかし、私はファイルがどこにあるのかを教えているので、問題は何か分かりません。

例2のコードを使用して喜んで作業していますが、かなりの数のプロジェクトサイトの後に共有ビューディレクトリが非常に忙しくなることを意味する可能性があります。

ViewsがViewsディレクトリに存在する必要がある理由が存在するかどうかは疑問です。

+0

地域を使用する必要があります。 – SLaks

+0

@marcind:あなたの権利、訂正ありがとう –

答えて

7

です。レイアウトのフルパスを提供する必要があるので、これは検索パスの問題ではないため、ビューを適切に初期化するにはweb.configの情報が必要です。

+0

これはうまくいきましたが、これはCSSのレンダリングを停止しましたが、ビューの表示は正しい方向の一歩です。 –

+0

web.configをインストールすると、これらのディレクトリのcssファイルが提供されなくなります(なぜか分かりません)。だから残念なことに、別のディレクトリツリーでCSSをpuする必要があります – Clicktricity

+0

これは動作しています。 httphandlerを見つけて変更すると、動詞は次のように表示されます: ''を実行すると、ビューファイルのみが検索され、残りはそのまま残ります –

4

デフォルトでは、RazorViewEngineViewsディレクトリを検索するように設定されています。

異なるパスで独自のRazorViewEngineインスタンスを作成し、ViewEngines.Enginesに追加することで、これを変更できます。

そのデフォルトのパスは、あなたがあなたのViewsディレクトリに配置されたweb.configファイルをコピーしてAssetsディレクトリにコピーを配置する必要があり

AreaViewLocationFormats = new[] { 
    "~/Areas/{2}/Views/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
    "~/Areas/{2}/Views/Shared/{0}.cshtml", 
    "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
}; 
AreaMasterLocationFormats = new[] { 
    "~/Areas/{2}/Views/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
    "~/Areas/{2}/Views/Shared/{0}.cshtml", 
    "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
}; 
AreaPartialViewLocationFormats = new[] { 
    "~/Areas/{2}/Views/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
    "~/Areas/{2}/Views/Shared/{0}.cshtml", 
    "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
}; 

ViewLocationFormats = new[] { 
    "~/Views/{1}/{0}.cshtml", 
    "~/Views/{1}/{0}.vbhtml", 
    "~/Views/Shared/{0}.cshtml", 
    "~/Views/Shared/{0}.vbhtml" 
}; 
MasterLocationFormats = new[] { 
    "~/Views/{1}/{0}.cshtml", 
    "~/Views/{1}/{0}.vbhtml", 
    "~/Views/Shared/{0}.cshtml", 
    "~/Views/Shared/{0}.vbhtml" 
}; 
PartialViewLocationFormats = new[] { 
    "~/Views/{1}/{0}.cshtml", 
    "~/Views/{1}/{0}.vbhtml", 
    "~/Views/Shared/{0}.cshtml", 
    "~/Views/Shared/{0}.vbhtml" 
}; 
+0

ありがとう。これはまさに私が必要としたものでした。 'Global.asax#Application_Start()'に 'RazorViewEngine'のカスタムインスタンスを登録したとき、私はカスタムビューパスのインテリセンスサポートを得ました。非常に役立ちます。 –

関連する問題