我有一个网站,我正在从经典ASP转换为ASP.NET。旧网站允许用户编辑网站模板,为网站的各个部分创建自己的设计(想想MySpace,只有LESS专业人士。)
我一直绞尽脑汁试图弄清楚如何用.NET做到这一点。我的网站通常使用母版页,但显然这对最终用户不起作用。
我已经尝试将HTML模板作为常规文本文件加载并解析它以“适应”内容占位符。它听起来很难看。
这里有一种通常被认为是最佳做法的东西,但我肯定找不到它。
有什么建议吗?
答案 0 :(得分:0)
您希望用户拥有多少控制权?
有几种方法可以实现这一点。我将简要总结一下我能想到的所有想法:
通过这种方法,您可以完全控制并最大限度地降低任何安全漏洞的风险。您可以将每用户HTML存储在某个数据库表中。此HTML将具有带有一些标记的预定义字段,例如使用{fieldName}
。然后,您将使用一个简单的解析器来标识大括号,并将fieldName
替换为从某处Dictionary<String,String>
拉出的字符串值。
如果您对字符串处理很聪明(即使用状态机解析器查找curley括号,将重建的字符串直接发送到输出或发送到StringBuilder等),这种方法可以很快,重要的是不使用String.Replace
)。缺点是它不是一个真正的模板系统:没有提供循环结果集(假设你想允许),表达式评估,但它适用于简单的“将此内容插入此空间”类型的设计。
如果可以使用ASP.NET,为什么要构建自己的模板系统?嗯,如果你想构建一个快速的'n'脏报告系统,这种方法是最简单的,但它在安全性方面非常失败。遗憾的是,由于ASP.NET的工作原理,您无法保护沙箱中ASPX文件中的任何<% %>
/ <script runat="server">
代码或使用CAS(我之前自己研究过这个问题:Code Access Security on a per-view ASP.NET MVC basis)。
您不需要将实际的ASPX和ASCX文件存储在网站的文件系统中,您可以使用VirtualPathProvider
实现将文件存储在数据库中,但是使其正常工作可能有点像痛苦(特别是当ASP.NET运行时编译ASPX文件时,如果用户修改了ASPX文件,则需要通知它)。您还需要注意ASPX加载与用户的请求路径相关联(除非您使用的是路由或MVC),因此您最好使用ASCX,而不是真的很重要。
这是最痛苦的选择,它存在于两者之间:您可以灵活地使用一流的模板引擎(循环,字段,必要时进行评估),而无需打开应用程序,直至出现安全漏洞。缺点是你需要自己构建几乎所有东西。我不会在这里详细介绍。
您选择的选项取决于您的要求。由于用户可以自由设置样式表并定义一些任意的常用HTML而不是直接修改其页面的常规模板,因此MySpace的系统更“皮肤化”而不是“模板化”。
您可以在ASP.NET中轻松实现类似MySpace的系统,假设每个可换肤特征都是作为Control
子类实现的,只需扩展您的Render
方法以允许插入所述任意HTML 。添加自定义样式表也很简单:只需将其添加到页面<style type="text/css">
中的<head>
元素内。
当/如果您允许用户直接输入HTML时,我强烈建议您解析它并过滤掉任何危险元素(例如<script>
,<style>
,<object>
等)。如果您希望允许嵌入YouTube视频和相关内容,则应分析<object>
元素以确保它们实际上是YouTube视频,提取视频ID,然后从已知的可信模板重新创建元素。重要的是,任何自定义HTML都是“标记平衡的”(您可以通过传递严格的XML解析器而不是更宽容的HTML解析器来验证这一点,因为XHTML(技术上)无论如何都是HTML的一个子集),就这样自定义标记不会破坏页面。
玩得开心。