2012-02-02 1 views
0

페이지 요청이있을 때마다 필자의 스파크 마스터 레이아웃을 선택해야합니다. 나는 ViewBag.Layout 값을 OnActionExecuting으로 설정하고 마스터 레이아웃 ref에서이 값을 참조하여이 작업을 시도했습니다.렌더링 시간에 동적으로 스파크 마스터 레이아웃을 선택하십시오.

<use master="${ViewBag.Layout}"/> 

그러나,이 스파크가 아니라 문자열로 코드가 아닌 같이 괄호 안에 코드를 치료하지 않는 것처럼 보인다 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/Home/Index.aspx 
~/Views/Home/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/Views/Home/Index.cshtml 
~/Views/Home/Index.vbhtml 
~/Views/Shared/Index.cshtml 
~/Views/Shared/Index.vbhtml 
Layouts\${ViewBag.Layout}.spark 
Shared\${ViewBag.Layout}.spark 

아무도 말해 줄 수 있습니까? 아니면이 일을하는 다른 방법을 가르쳐 주시겠습니까?

답변

1

코드 구문을 사용하여 레이아웃을 동적으로 선택할 수 없습니다. 그 이유는 레이아웃이 엔진에서 렌더링이 이루어지기 전에 선택되기 때문입니다. 먼저 레이아웃이 위치하고 엔진이 모든 변수를 렌더링하려고 시도합니다. 레이아웃에 변수를 사용하면 렌더링 엔진이 열 파일을 알 수 없다는 것을 의미합니다.

+0

정보 주셔서 감사합니다. 불가능하다고 생각하여 다른 해결책을 선택했습니다. – jcvandan

0

실제로. 가능합니다 .. 코드 예제를 사용하는 대신. ResultFilter를 사용하십시오.

public void OnResultExecuting(ResultExecutingContext filterContext) { 
     var viewResult = filterContext.Result as ViewResult; 
     if (viewResult == null) 
      return; 

     var layoutFile = viewResult.ViewBag.Layout; //the variable you set in your action executing, 

     viewResult.MasterName = layoutFile; 

    }