我正在为客户端构建ASP.Net MVC 2应用程序,它需要用户定义视图的能力。在这个网站上它显示了如何做到这一点 - http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views,但我在那里和其他地方发表了一些评论,这是一个坏主意。什么是允许用户定义整个页面的最佳方法?另外,为什么数据库是个坏主意?感谢。
瓦德
答案 0 :(得分:6)
如果您可以使用MVC 3 Beta而不是MVC 2编写应用程序,那么您可以使用此技术:
http://buildstarted.com/2010/11/02/razor-without-mvc-part-ii/
您可以将“View”存储为数据库中的字符串,然后将其拉出并将其传递给解析引擎,您就可以了。
效果很好。
答案 1 :(得分:1)
我想这可能是一个坏主意的原因是,在从视图中运行所有任意代码之后,您将为用户提供对应用程序的根级访问权限。此外,程序员不会检查或测试这些视图,它们可能无法编译或者可能存在其他问题。
您可以解析构成视图的用户提供的文本并尝试对其进行清理,但这很难。虽然将MVC视图引擎作为您的CMS看起来像是在为您提供框架来为您做繁重的工作但它太强大了;在代码中表达用户不能做的事情比在代码中表达他们可以做什么更难。这就是为什么(也许)这个网站在问题和答案中使用markdown而不是HTML来标记。
至于数据库是一个坏主意,我认为人们可能会反对这一点,因为他们认为难以击中数据库。但是我不确定这是一个不可逾越的问题;该视图可能会被jit'ed后缓存,虽然我不确定,你需要测试它。如果是这样,您将不得不找到一种方法,在编辑视图时再次运行jit,或者您必须回收该站点。我假设强制存在重新jit,因为当您在非预编译站点中更改aspx文件时,框架会从操作系统获取文件更改通知,然后在下次访问时再次对更新后的视图进行jit。即使我错了,并且每次使用它都会将视图从数据库中拉出并进行jit'ed,你应该能够使用缓存来阻止这种情况发生太多。
在某些情况下,db中的视图可能是最好的方法,例如,如果创建视图的用户是程序员。我会仔细考虑它。
至于替代方案,CMS工具包(N2,Orchard等)可能是一个好主意。