我希望在Web应用程序中实现一些模板,并希望利用ASP.NET的模板控件。但是,我不想依靠物理.ascx文件或VirtualPathProvider来加载模板。

我希望能够从数据库或其他数据存储区(在内存中)加载模板。在给定.ascx模板的字符串表示形式的情况下,是否可以实现LoadTemplate()方法的返回ITemplate的任何实现?

如果没有,我该如何写一个? 仅供参考,肯特科(Kentico)具有类似的功能,但是他们依靠基因编码标签才能在基因编码标签类上使用基因编码标签。通过这种方法,他们可以加载存储在数据库中的模板(他们称其为转换)。

有帮助吗?

解决方案

是的,如果字符串或数据库是您要使用的源,则VirtualPathProvider可能是您要使用的方法。(也有一些代码生成器可以发出代码,但是通常会在动态构建代码时使用这些代码生成器,而不是像您这样从外部源加载代码。)

您没有提到为什么,但是您不想使用VirtualPathProvider。是因为不想,还是因为在特定情况下有一些特殊要求而导致?

最后,如果动态加载和编译代码“看起来很琐碎”,那么您不知道整个.Net系统在运行动态代码之前必须做什么—程序集生成,编译和JIT,应用程序上下文,类/成员名称解析,代码安全性等。也许您只是对.Net如何轻松完成其他复杂任务感到迷恋。;-)

其他提示

我一直面临类似的问题。但是,要获得这么小的收益,VirtualPathProvider实在是太多了,更不用说了,更不用说它似乎在实现安全性方面有点冒险。我发现了两种可能的解决方法:

1)使用反射来获得您想要的: 通用标签

2)使用一种有点怪异的解决方法: 通用标签

我公开地告诉管理员,这都不是一个很好的解决方案。理想情况下,.Net Framework中将有一种用于此类事情的方法。像这样: 通用标签

这将减轻实现VirtualPathProvider的整个需求。也许我们会在ASP.NET vNext中看到它:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top