【问题标题】:Use multiple templates with separated viewmodel with RazorEngine通过 RazorEngine 使用具有分离视图模型的多个模板
【发布时间】: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


【解决方案1】:

您可以将页眉/页脚的内容放入 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

【讨论】:

  • 我想坚持我的强类型方法,因为以后我想集成 Intellisense。
  • 也许您可以扩展 TemplateBase 以包含您的模型的页眉和页脚属性,保持它们的强类型。然后您可以在运行 service.Compile() 后设置模型属性,这将返回模板。 antaris.github.io/RazorEngine/…
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多