【发布时间】:2016-07-29 13:34:21
【问题描述】:
我创建了一个 template.cshtml,其中包括 2 个部分 header.cshtml 和 footer.cshtml。
当它被渲染时,它看起来像这样:
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 命名空间,请不要感到困惑,那是为了测试...
【问题讨论】:
-
您已经在
@include中提供了模型,所以只需将它们存储在其他地方而不是传入的模型中? -
如何调用包含而不是同时传递模型?请给我一个示例代码吗?
-
您从其他地方提供模型。它不必位于您为视图提供的同一模型中。或者你可以总是推送一个简单的模型来封装这三个模型,这样它们就可以分开了。
-
正如我所说,我不想封装任何模型。但到目前为止,似乎只有像 Stewart 所说的那样使用 @ViewBag.Header 的可能性。
-
您说您不希望他们彼此了解,他们不需要,但无论如何视图确实需要。如果这不合适,那么 ViewBag 很可能是唯一合理的选择。
标签: c# razor razorengine