.Net 模板引擎,带有对象图输出,而不是字符串

Posted

技术标签:

【中文标题】.Net 模板引擎,带有对象图输出,而不是字符串【英文标题】:.Net templating engine with object graph output, not string 【发布时间】:2010-11-25 21:25:23 【问题描述】:

我想知道是否有任何用于创建对象图的模板引擎?有许多创建 html 或其他字符串结果的内容。但我想要一个吐出对象的模板引擎。可以说是预处理器。

我有一个应用程序需要某种预定义的对象图,用于呈现特定的页面小部件。例如,我的页面上有一个工具栏,但每个页面都有不同的工具栏。它可能看起来非常相似。但例如按钮 Add 将指向一个页面上的不同 URL。

示例对象图(部分):

IList<ToolbarItem> toolbar = new List<ToolbarItem> 
    new ToolbarButton 
        Text = PageResources.NewText,
        Url = Url.Action("Add", "Items"),
        Icon = ToolbarIconType.New
    ,
    new ToolbarSeparator(),
    new ToolbarDropDown 
        Text = PageResources.DropDownText,
        Icon = ToolbarIconType.Filter,
        Items = new List<ToolbarDropDownItem> 
            new ToolbarDropDownItem 
                Text = PageResources.FirstItem,
                Url = Url.Action("Whatever", "Filter")
            ,
            new ToolbarDropDownItem 
                Text = PageResources.SecondItem,
                Url = Url.Action("BlahBlah", "Filter"),
                Icon = ToolbarIconType.Search
            ,
            ...
        
    ,
    ...
;

这个静态定义(带有动态资源和动态 URL 助手调用)可能会变得非常冗长和复杂。想想类似于 Word 的类似功能区的工具栏。非常复杂且冗长。

我希望将这些对象生成模板存储在数据库中,并且每个页面都可以读取它们自己的内容,然后模板引擎将生成它并使用特定的资源类型 + 键来放入本地化数据。同样的事情会使用操作的 URL...

在对象反序列化(XML 或 JSON)中进行了类似的操作。但内置(反)序列化技术不支持变量替换或资源链接或类似的。最好的办法是支持资源链接和 lambda 表达式。

总结一下:是否有任何 .net 对象图模板引擎/预处理器可以满足我的需求?

【问题讨论】:

难道你不能让所有这些对象都可以 Xml 序列化,然后使用普通的模板引擎来生成 Xml,然后再将其反序列化为对象吗? @Lasse:当然可以。但是,是否有引擎已经开箱即用了这两个步骤? 我不知道,但反序列化部分是,什么... 2行代码? XmlSerializer serializer = new XmlSerializer(typeof(Toolbar)); var tb = Serializer.Deserialize(...) as Toolbar; @Lasse:不完全是。这个引擎应该能够使用任何资源源等生成任何类型的对象图。想想它似乎并不那么简单。编写模板不应该更复杂,而是尽可能简化。你不觉得 XML 很麻烦吗? JSON 衍生似乎更方便。至少对我来说。 【参考方案1】:

这是一个非常有趣的问题。

我认为一种选择是生成 XAML,然后使用 XamlReader.Load (see MSDN) 加载 XAML 描述的对象树(或图形)。请注意,XAML 可用于构造任何符合一些基本要求的 .NET 对象(例如,如果它们应该可用作集合,则具有公共 get/set 属性并实现一些接口)。

此外,XAML 是一个 XML 文档,因此应该可以使用可以生成 XML 文件的标准文本模板引擎来生成 XAML 文档。

【讨论】:

【参考方案2】:

JSON 序列化

我决定使用 Json.Net 库主要是因为编写 JSON 字符串非常易于人类阅读,或者我应该说 Web 开发人员可读并且易于维护。它与普通的 javascript JSON 非常相似,但具有额外的语法糖(引用保存、类型保存等)

Json.NET 库是对提供的 JavaScriptSerializerDataContractSerializer 类的一个非常好的升级。

【讨论】:

以上是关于.Net 模板引擎,带有对象图输出,而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

Java模板引擎 FreeMarker

从字符串而不是从文件加载模板

php模板引擎的原理与简单实例

Free 基础概念

layui模板引擎如何使用第一季

为什么 ASP.NET Core WebAPI 继承 ControllerBase 而不是 Controller ?