使用带有RazorEngine的分离viewmodel的多个模板

时间:2016-07-29 13:34:21

标签: c# razor razorengine

我创建了一个template.cshtml,其中包含2个partials header.cshtml和footer.cshtml。

渲染时,它看起来像这样:

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>

我不喜欢的解决方案是视图模型必须相互包含。

我想将每个视图模型分开,一个不应该知道另一个。原因是内容不应该知道一般页眉或页脚,或者不应该是一般页眉/页脚的父级。

因为我想重复使用具有许多不同“内容”视图模型的模板。

根据我现有的代码,我到底需要做些什么来改变这项工作?

注意:如果您阅读RazorMachine命名空间,那就不会感到困惑,那就是测试...

1 个答案:

答案 0 :(得分:0)

您可以将页眉/页脚的内容放入Viewbag

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

然后在模板中,您可以使用@ ViewBag.Header

访问viewbag

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