9

是否可以使用 asp 模板引擎(使用部分代码隐藏类、动态 <% ... %> 块等)来生成非 HTML?我想要一种干净且可维护的方式来动态生成代码。(具体来说,我想生成填充了数据库值的 LaTeX 代码。)

目前,我的 LaTeX 模板是带有占位符的资源字符串,我将这些字符串替换为数据库值。这种解决方案很快变得非常难以维护和清洁。我真的很想使用 aspx 标记中的动态块,但我不确定 a)当输出不是 HTML 时,aspx 是否会合适,或者 b)如何将结果实际呈现到 .tex 文件中.

生成代码本身位于 C# .dll 中。我们正在使用 .NET 3.5

这可能吗?提前致谢。

4

5 回答 5

7

Visual Studio 2008 本机或 Visual Studio 2005 SDK 附带的 T4 模板,您几乎可以生成任何您想要的东西。

您可以通过以下链接获得更多信息:

我很确定所有这些链接都是您探索的良好开端。

如果要在 Visual Studio 之外生成 T4 模板,可以使用自定义 MSBuild 任务来调用 T4 模板(链接

下面是 MSBuild 任务的“执行”代码示例。点击这里查看源代码

public override bool Execute()
{
    bool success = false;

    //read in the template:
    string template = File.ReadAllText(this.TemplatePath);

    //replace tags with property and item group values:
    ProjectHelper helper = new ProjectHelper(this);
    template = helper.ResolveProjectItems(template);

    //copy the template to a temp file:
    this._tempFilePath = Path.GetTempFileName();
    File.WriteAllText(this._tempFilePath, template);

    //shell out to the exe:
    ProcessHelper.Run(this, TextTransform.ToolPath, TextTransform.ExeName, string.Format(TextTransform.ArgumentFormat, this.OutputPath, this._tempFilePath));
    success = true;

    return success;
}
于 2008-10-22T19:28:16.607 回答
0

我不明白为什么不。我在以前的工作中认识的人使用 ASP.NET 页面和中继器控件创建了一个数据库包装器生成器来插入属性。然后,他将文档内容写入源文件。

如果您担心 ASP.NET 会失败,您可以创建一个非常有限的测试用例并亲自查看。不应该花太多时间来测试一个理论并让您知道它是否满足您的需求。

于 2008-10-22T19:13:07.557 回答
0

这当然是可能的。大多数服务器控件将被淘汰,因为它们会自动发出 HTML 标记。但是,您可以对页面进行数据绑定并使用数据绑定表达式。Visual Studio 无疑会抱怨无效标记。

然后,您必须通过 Cassini 或 ASP.NET 管道运行您的页面以获取输出。我在某个地方有一个单元测试工具可以做到这一点,而且非常简单。

不过,更好的主意可能是使用代码生成器。像 CodeSmith 这样的东西应该可以很好地工作,甚至 Visual Studio 的内置T4也为您提供了很大的灵活性,而不是试图将您束缚在 HTML 中。

于 2008-10-22T19:17:48.297 回答
0

对于代码生成,您应该查看 T4 模板功能。它使用类似于 ASP.Net 的语法。

请参阅 Scott Hanselmans 帖子: http ://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

于 2008-10-22T19:19:10.900 回答
0

是的你可以。只需创建一个标准的 .aspx 页面,删除所有 HTML 并在页面中放置您想要的任何内容。然后,您可以使用 <% %> 标记在页面中放置动态内容。就像 Jason Z 所说,您可以使用 Repeater 控件遍历项目集合以在“页面”中列出。此外,您将无法使用所有其他服务器控件,因为它们会生成 HTML,但您仍然可以根据需要创建自己的服务器控件和/或用户控件。

于 2008-10-22T19:19:19.853 回答