2013-03-16 1 views
4

그래서 나는 Global.asax의 모든 분야를 등록 :내 지역에서 FindPartialView 검색을 수행하려면 어떻게해야합니까?

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    //... 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
} 

하지만 내 /Areas/Log/Controllers에, 내가 찾으려고 할 때 PartialView :

ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "_LogInfo"); 

실패, viewResult.SearchedLocations은 다음과 같습니다

"~/Views/Log/_LogInfo.aspx" 
"~/Views/Log/_LogInfo.ascx" 
"~/Views/Shared/_LogInfo.aspx" 
"~/Views/Shared/_LogInfo.ascx" 
"~/Views/Log/_LogInfo.cshtml" 
"~/Views/Log/_LogInfo.vbhtml" 
"~/Views/Shared/_LogInfo.cshtml" 
"~/Views/Shared/_LogInfo.vbhtml" 

따라서 viewResult.Viewnull입니다.

내 지역에서 FindPartialView 검색을 만들려면 어떻게해야합니까?

업데이트 : 이 내가 Global.asax에 등록 된 내 사용자 정의보기 엔진입니다 :

public class MyCustomViewEngine : RazorViewEngine 
{ 
    public MyCustomViewEngine() : base() 
    { 
    AreaPartialViewLocationFormats = new[] 
    { 
     "~/Areas/{2}/Views/{1}/{0}.cshtml", 
     "~/Areas/{2}/Views/Shared/{0}.cshtml" 
    }; 

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

    // and the others... 
    } 
} 

그러나 FindPartialViewAreaPArtialViewLocationFormats 사용하지 않는 : 나는 정확히했다

"~/Views/Log/_LogInfo.cshtml" 
"~/Views/Shared/_LogInfo.cshtml" 

답변

2

을 동일한 문제, 내가 사용하는 중앙 Ajax 컨트롤러가 있는데, 다른 폴더/위치에서 다른 부분 뷰를 리턴한다.

은 무엇 당신이해야 할가는 것은 새로운 ViewEngineRazorViewEngine에서 파생에서 부분 지문을 검색 할 생성자에서 새로운 위치를 명시 적으로 포함 (난 당신이 면도기를 사용 있으리라 믿고있어) 만드는 것입니다. 또한

FindPartialView 메소드를 대체 할 수 있습니다. 기본적으로 Shared 폴더와 현재 컨트롤러 컨텍스트의 폴더가 검색에 사용됩니다.

다음은 사용자 정의 RazorViewEngine 내의 특정 속성을 재정의하는 방법을 보여주는 example입니다.

당신은 당신의 PartialViewLocationFormats에 부분의 경로를 포함해야한다

업데이트 같은 배열 : 마찬가지로 당신이 당신에게 다음 Area 폴더 내부의 컨트롤러에서 부분을 찾으려면

public class MyViewEngine : RazorViewEngine 
{ 
    public MyViewEngine() : base() 
    { 
    PartialViewLocationFormats = new string[] 
    { 
     "~/Area/{0}.cshtml" 
     // .. Other areas .. 
    }; 
    } 
} 

AreaPartialViewLocationFormats 어레이에 표준 부분 뷰 위치를 추가해야합니다. 나는 이것을 시험했고 그것은 나를 위해 일하고있다.

그냥 당신의 Global.asax.cs에 새로운 RazorViewEngine을 추가해야합니다 예 :

// File resides within '/Controllers/Home' 
public ActionResult Index() 
{ 
    var pt = ViewEngines.Engines.FindPartialView(ControllerContext, "Partial1"); 
    return View(pt); 
} 

내가 저장 한 :

여기
protected void Application_Start() 
{ 
    // .. Other initialization .. 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new MyViewEngine()); 
} 

는 "홈"이라는 실시 컨트롤러에서 사용할 수있는 방법입니다 부분은 /Area/Partial1.cshtml 경로에서 찾고 있습니다.

+0

감사합니다. 더 자세히 설명해 주시겠습니까?필자는 현재 사용자 정의 뷰 엔진을 보유하고 있으며 위치를 설정했지만 (내 업데이트 참조) FindPartialView는이를 사용하지 않습니다. 어떤 pointes? –

+0

일반 MVC 위치 (예 : 루트보기)에서 Area 폴더의 부분 뷰를 찾으려는 경우 경로 (~/Areas/{2}/Views/{1}/{ 0} .cshtml)을 PartialViewLocationFormats 배열에 추가하십시오. – gdp

+0

경로를 표시하지만 viewresult return이 null 인 (~/Areas/{2}/Views/{1}/{0} .cshtml)을 시도하고 있습니다. – user2156088

관련 문제