2012-02-15 5 views
0

まずは少しの文脈。あなたはビュー名を送信Html.RenderPartialを呼び出すと、そのビューはRazorViewEngine.PartialViewLocationFormatsで指定された場所で検索されます:名前を指定するだけでRazor Layoutファイルを設定する方法は?

Html.RenderPartial("Post", item); 

あなたはカミソリのページでレイアウトプロパティを設定すると、あなただけの名前を言うcan'tパスを指定する必要があります。どうすれば名前を指定できますか?

//Layout = "_Layout.cshtml"; 
Layout = "_Layout"; //Dont work 

私はRazorViewEngine.MasterLocationFormatsをオーバーライドしたので、これが必要です。

現在、私は、コントローラのマスターを指定しています:

return View("Index", "_Layout", model); 

これは動作しますが、私が見るに、これを行うことを好みます。

+2

この質問を見http://stackoverflow.com/questions/5357104/is-is-possible-to-specify-searchable-、としてそれを使用することができますビューで

public static class HtmlExtensions { public static string ReadLayoutPath<T>(this HtmlHelper<T> html,string layoutName) { string[] layoutLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; foreach (var item in layoutLocationFormats) { var controllerName= html.ViewContext.RouteData.Values["Controller"].ToString(); var resolveLayoutUrl = string.Format(item, layoutName, controllerName); string fullLayoutPath = HostingEnvironment.IsHosted ? HostingEnvironment.MapPath(resolveLayoutUrl) : System.IO.Path.GetFullPath(resolveLayoutUrl); if (File.Exists(fullLayoutPath)) return resolveLayoutUrl; } throw new Exception("Page not found."); } } 

位置 - フォーマット - の - mvc - 剃刀レイアウト – sarvesh

答えて

1

あり、それを行うための直接的な方法は、ありません しかし、我々は、実行時に完全なレイアウトパスを与えるだろう「れるrenderPartial()」のようなHtmlExtensionを書くことができます。我々は

@{ 
Layout = Html.ReadLayoutPath("_Layout"); 
} 
0

なぜこれをやっているのか、具体的にはなぜコントローラからレイアウトページを返すのか尋ねることはできますか?マスターページのポイントが見当たりません。

「名前」だけを指定することはできません。レイアウトビューのパスを指定して、ビューがレンダリングされるようにする必要があります。

Layout = "~/SomeCustomLocation/SomeFolder/_Layout.cshtml" 
+1

私はコントローラから戻っていない、これは私が見つけた回避策です。名前を指定できない場合は、RazorViewEngine.MasterLocationFormatsの目的は何ですか? –

+0

これを行う正当な理由がいくつかあります。例えば、完全に異なるwwwrootなどを使用できるようにする、あなたのマスターWebサイトへのプラグインプロジェクトがあります – rolls

関連する問題