【问题标题】:RazorEngine - Use Layout and Html.RawRazorEngine - 使用布局和 Html.Raw
【发布时间】:2012-05-12 20:20:27
【问题描述】:

我想将以下 Razor 模板与 RazorEngine 一起使用:

@{
    Layout = null;
}

@Html.Raw(MyNamespace.MyClass.SomePropertyWithHtml)

当我调用它时,我得到 2 个错误 - 一个抱怨它无法处理 Layout,另一个抱怨它不知道如何处理 Html 帮助程序。

这里还有其他问题和答案表明这在 v3 中是可能的,我正在使用 NuGet 上的当前包 - v3.0.8 - 但目前尚不清楚这是如何完成的。目前我这样称呼它:

string html = RazorEngine.Razor.Parse(File.ReadAllText(path));

其他答案建议先使用 Razor.SetBaseTemplate,它不会出现在当前源代码或 git 上的 3.0 分支中。查看代码我看到引用布局和部分的代码,但布局代码似乎依赖于按名称解析模板,而我正在尝试做的甚至不需要解析模板 - 我只需要它来应对布局 = null。该代码还包括一个 MvcTemplateBase,它似乎在 Web 项目中提供了一个 HtmlHelper - 但它是该项目中唯一的类,并且在 Web 或核心项目中的任何地方都没有引用。

这个类似的问题: RazorEngine issues with @Html

只是指向主页的链接,说明您可以在那里找到更多信息 - 主页只是描述项目的简短句子。

那么,如何使用 RazorEngine v3.0 解析上述 Razor 视图?

【问题讨论】:

  • 哦,您使用的是 RazorEngine...要记住的一件事是 Razor 不是 MVC。新的 RazorEngine 已经完成了很多工作,但 Antaris 最近真的很忙。您应该可以在文件顶部使用@inherits MvcTemplateBase<T> 来使用它。
  • 感谢您的建议。我意识到 Razor 和 MVC 是分开的,但我的目标是在正常的 ASP.Net 管道内外使用相同的 MVC Razor 模板。 NuGet 上的版本不包含名为 MvcTemplateBase 的类。 Git 上的最新版本可以,但它不是通用的——它只是 MvcTemplateBase。如果我添加像 @inherits RazorEngine.Razor.MvcTemplateBase 这样的行,我会在 TemplateService.SetModelExplicit 中得到一个异常,抱怨模板类型没有名为 Model 的属性。想法?

标签: layout razor html-helper razorengine


【解决方案1】:

Layout 属性和Html 帮助器不是TemplateBase 的一部分,并且作为RazorEngine (v3.4.1) 最新版本的一部分的MvcTemplateBase 的实现似乎不完整( InitHelpers 似乎没有初始化助手?)。您需要创建自己的基本模板来实现这些功能。

如您所述,v3+ 版本不包含 Razor.SetBaseTemplate 方法。您可以像这样在当前版本中设置基本模板类型:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration
    {
        BaseTemplateType = typeof(MyTemplateBase<>)
    };

using (var service = new RazorEngine.Templating.TemplateService(config))
{
    Razor.SetTemplateService(service);
    return MvcHtmlString.Create(Razor.Parse<TModel>(templateText, model));
}

如果您需要初始化助手,在IActivator 的自定义实现中覆盖CreateInstance 可能会有所帮助,可以像BaseTemplateType 一样将其提供给TemplateServiceConfiguration

var config = new RazorEngine.Configuration.TemplateServiceConfiguration
    {
        BaseTemplateType = typeof(MyTemplateBase<>),
        Activator = new MyActivator()
    };

【讨论】:

  • 嗯,您使用的是哪个版本的 RazorEngine?还是您将 MvcTemplateBase 派生为您自己的类?当前源没有通用版本的 MvcTemplateBase:github.com/Antaris/RazorEngine/blob/master/src/Web/…
  • 这是 MvcTemplateBase 的本土实现。上面的重点是证明您实际上仍然可以设置一个基本模板来继承所有视图,这将允许您实现 Html 助手、基本布局功能或任何您想要的应该需要 RazorEngine 的 TemplateBase 不提供开箱即用的功能。
  • 澄清了我上面的回答。我早些时候注意到这个问题已经超过 2 年了,但我认为这仍然可以回答它。让我知道是否有任何不清楚的地方。也许这仍然会对某人有所帮助。
猜你喜欢
  • 2014-06-29
  • 2012-07-09
  • 2012-10-30
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多