2012-02-15 3 views
0

처음에는 약간의 맥락입니다. 당신이보기 이름을 보내 Html.RenderPartial 호출하면, 해당 뷰는 RazorViewEngine.PartialViewLocationFormats에 의해 지정된 위치에서 검색됩니다 :이름을 지정하는 것만으로 면도기 레이아웃 파일을 설정하는 방법은 무엇입니까?

Html.RenderPartial("Post", item); 

당신이 면도기 페이지의 레이아웃 속성을 설정하면, 당신은 그냥 이름을 말 할수 없어 , 경로를 지정해야합니다. 어떻게 이름을 지정할 수 있습니까?

//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- 위치 포맷을위한 mvc-razor-layout – sarvesh

답변

1

가, 그것을 할 수있는 직접적인 방법이 없다하지만 우리는 런타임에 전체 레이아웃 경로를 줄 것이다 "RenderPartial()"와 같은 HtmlExtension를 작성할 수 있습니다. 우리가로 사용할 수 있습니다보기에

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."); 
    } 
} 

이 질문에

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

왜 이렇게했는지 구체적으로 물어볼 수 있습니까? 컨트롤러에서 레이아웃 페이지를 반환하는 이유는 무엇입니까? 마스터 페이지의 요점을 놓치고 있습니다.

"이름"만 지정할 수는 없으므로 레이아웃보기의 경로를 지정해야만보기가 렌더링에 적용될 수 있습니다.

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

컨트롤러에서 돌아 오지 않을 것입니다. 이것은 발견 된 해결책입니다. 이름을 지정할 수 없으면 RazorViewEngine.MasterLocationFormats의 목적은 무엇입니까? –

+0

정당한 이유가 있습니다. 예를 들어 완전히 다른 wwwroot 등을 사용하도록 허용하려는 마스터 웹 사이트의 플러그인 프로젝트가 있습니다. – rolls

관련 문제