我如何分离剃刀视图?
有没有办法将Razor语法和(定制)帮助者暴露给人,但是说......不允许他们创建代码块,或者仅限于他们使用帮助者并且不给他们力量在视图中执行纯C#代码?我如何分离剃刀视图?
欢迎任何想法和类似解决方案的指针!
更新: //我想给予用户编写他们自己的HTML并且只能访问html助手列表的权限。大多数是默认的和我创建的。
例如,我不希望他们能够内@{ //code }
块和 还没有using
和@model
(不知道这个) 只能访问执行代码@Html.*
@if
else
for
foreach
或更好但是,只允许他们访问特定的命名空间(这只是一个思路)
更新:// 经过一些测试后,我发现RazorEngine的操作与我正在尝试的操作非常接近要做到:在隔离的环境中运行视图并添加对特定命名空间的访问权限。
有一个名为RazorEngine的项目,建立在微软的Razor之上,它允许你在不返回MVC视图的情况下解析该语法。下面是如何使用它:
string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });
你也可以指定自定义模板的基础,这应该允许您定义只有HTML辅助你希望暴露给用户:
Razor.SetTemplateBase(typeof(HtmlTemplateBase<>));
string template =
@"<html>
<head>
<title>Hello @Model.Name</title>
</head>
<body>
Email: @Html.TextBoxFor(m => m.Email)
</body>
</html>";
var model = new PageModel { Name = "World", Email = "[email protected]" };
string result = Razor.Parse(template, model);
RazorEngine中的独立模板就是我一直在寻找的!谢谢! – Aviatrix 2013-03-03 15:13:52
我不会推荐你这样做。没有一种简单可靠的方法可以在不影响网站安全的情况下提供这种能力。如果你信任你的用户,那么你可以做到这一点。如果你没有,那么像DotLiquid
这样的模板引擎就更适合于这个目的。
Darin,我不想实现另一个模板引擎,我已经有Razor,我想利用它提供的真棒语法,并且限制人们可以执行的功能。 – Aviatrix 2013-02-26 13:06:49
你相信你的用户吗?看来你并不是因为你在问怎样阻止他们做某些行动。恐怕剃刀不是为此目的而设计的。 – 2013-02-26 13:10:46
感谢您突出显示DotLiquid,似乎是一个伟大的图书馆为此目的 – 2015-07-09 12:30:08
我从来没有这样做过,但它听起来像你想让用户能够编写代码并编译使用,是吗?
如果是这样,您可能需要查看CSharpCodeProvider
类,RazorTemplateEngine
类和System.CodeCom.Compiler
命名空间。
看一看这里对这些类的一些信息:
CSharpCodeProvider:http://support.microsoft.com/kb/304655
RazorTemplateEngine:http://msdn.microsoft.com/en-us/library/system.web.razor.razortemplateengine(v=vs.111).aspx
你可以尝试改变Razor视图引擎和相关类检查不允许的情况下。
当生成源文件(查看引擎生成要编译的源文件)时,必须手动检查(通过解析c#或vb.net代码)。这是可能的,但不可行(真的)。
即使您已设法分析和检查代码,您必须标识您的代码(允许)和客户代码(其中有限制)。
最后你必须接受这样一个事实,除了使用其他模板引擎之外,你不能真的禁止任何其他事情。
因为
- 您的客户将找到一种方法,使他们的意见看起来像你的。
- 你不能限制最基本需要的功能,如
var r = new Random();
- 你不能估算一下最基本的要求是
- 你不能说没有给你的客户,当他们需要用自己的自定义库
顺便说一句,你可以尝试另一件事。编写虚拟路径提供程序,并在运行时请求时转换在AviatrixTemplate
中编写的客户模板。通过使用这条路线,你仍然使用剃须刀引擎,转换时只需要很少的时间(这只是一次)。但是您的AviatrixTemplate
不会太高兴,而且您仍然需要检查不允许的代码。
PS:一个基本的循环可能会给你的用户更多,然后你想要的。例如下面的代码允许创建一个类并调用它一次。他们可能使用完全合格的课程名称或可能使用Activator.CreateInstance
。
@for (var r = new Random(); r != null; r = null)
{
@r.NextDouble()
}
只是不打扰。
请加的用户实例允许的活动及其效果。应该至少有5个,因为很难完全理解这种方法的范围。更新了 – 2013-02-23 16:01:27
。至少应该有5个? – Aviatrix 2013-02-23 16:07:51
你的问题很有趣,但很难理解具体细节。因此,请举例说明您希望用户能够输入的代码块以及您不希望它们能够输入的代码块。 – 2013-02-23 16:10:50