2016-07-29 1 views
3

2 개의 부분 header.cshtml과 footer.cshtml을 포함하는 template.cshtml을 만들었습니다.RazorEngine과 분리 된 뷰 모델로 여러 템플릿 사용

는 렌더링되는 경우는 다음과 같습니다

enter image description here

IRazorEngineService service = RazorEngine.Engine.Razor; 

string _webPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "views"); 
var config = new TemplateServiceConfiguration 
{ 
    //Use this template manager when loading from template files. 
    TemplateManager = new ResolvePathTemplateManager(new[] { _webPath }) 
}; 

service = RazorEngineService.Create(config); 
ITemplateKey key = service.GetKey("template"); 

service.Compile("header", typeof(HeaderViewModel)); 
service.Compile("footer", typeof(FooterViewModel)); 

var model = new ContentViewModel(); 
model.Content = "This is the content"; 

model.FooterViewModel = new FooterViewModel(); 
model.HeaderViewModel = new HeaderViewModel(); 
model.FooterViewModel.Footer = "footer"; 
model.HeaderViewModel.Header = "header"; 

var html = service.RunCompile(key, model.GetType(), model); 

template.cshtml

@model RazorMachineTest.ContentViewModel 

<html> 
<body> 
     <header> 
      @Include("header", @Model.HeaderViewModel, typeof(RazorMachineTest.HeaderViewModel)) 
     </header> 

     <h1>@Model.Content</h1> 

     <footer> 
      @Include("footer", @Model.FooterViewModel, typeof(RazorMachineTest.FooterViewModel)) 
     </footer> 

</body> 
</html> 

header.cshtml

@using RazorEngine 
@using RazorMachineTest 

<b>I am inside the</b> 
<span>@Model.Header</span> 

footer.cshtml는

@using RazorEngine 
@using RazorMachineTest 

<b>I am inside the </b> 
<span>@Model.Footer</span> 

내가 해결책에 대해 좋아하지 않는 것은 viewmodels 서로에 포함되어야한다는 것입니다.

각 뷰 모델을 분리하고 싶습니다. 다른 뷰 모델을 구분해서는 안됩니다. 그 이유는 콘텐츠가 일반적인 머리말이나 꼬리말을 알지 못하거나 일반 머리말/꼬리말의 부모가되어서는 안되기 때문입니다.

많은 다른 '콘텐츠'보기 모델로 템플릿을 다시 사용하고 싶기 때문에.

기존 코드를 기반으로이 작업을 수행하려면 정확히 무엇을 변경해야합니까?

참고 : RazorMachine 네임 스페이스를 읽으면 돈`t이

+0

당신은 이미'@ 그래서 그냥 다른 곳에 보관 include' A의 모델을 제공하고 ViewBag.Header @으로 viewbag에 액세스 할 수 있습니다 모델에 들어 있지 않습니까? –

+0

Include를 호출하고 모델을 같은 시간에 통과시키지 않으려면 어떻게해야합니까? 샘플 코드를 들려 주시겠습니까? – HelloWorld

+0

다른 곳에서 모델을 제공하십시오. 그것은 당신이보기에주는 것과 같은 모델 안에있을 필요는 없습니다. 또는 세 모델을 캡슐화하는 간단한 모델을 항상 밀어 넣을 수 있습니다. 이렇게하면 모델을 분리 할 수 ​​있습니다. –

답변

0

당신은에

var viewBag = new DynamicViewBag(); 
viewBag.AddValue("Footer", "footer"); 
viewBag.AddValue("Header", "header");        
var html = service.RunCompile(key, model.GetType(), model, viewBag); 

그런 다음 Viewbag에 머리글/바닥 글에 대한 내용을 넣을 수 ... 그 테스트했다 혼동 템플릿 당신은

https://antaris.github.io/RazorEngine/TemplateBasics.html#Supported-syntax

+0

나중에 필자는 Intellisense를 통합하고자하므로 강력하게 형식화 된 방식을 고수하고 싶습니다. – HelloWorld

+0

아마도 TemplateBase 을 확장하여 머리글과 바닥 글에 대한 모델의 속성을 포함하고 강력하게 입력 할 수 있습니다.그런 다음 템플릿을 반환하는'service.Compile()'을 실행하면 모델 속성을 설정할 수 있습니다. https://antaris.github.io/RazorEngine/TemplateBasics.html#Extending-the-template-Syntax –