有没有办法向人们公开Razor语法和(自定义)助手,但是说......不允许他们创建代码块,或者只是限制他们使用助手并且不给他们力量在视图中执行纯C#代码?
欢迎提出类似解决方案的任何想法和建议!
更新: //我想让用户有权编写自己的HTML,并且只能访问html助手列表。主要是默认的和我创建的。
例如,我不希望他们能够在@{ //code }
块内执行代码
也没有using
和@model
(对此不确定)
只能访问@Html.*
@if
else
for
foreach
或者更好的是,让他们只访问特定的名称空间(这只是一个想法)
更新:// 经过一些测试,我发现RazorEngine与我正在尝试做的一样接近:在隔离环境中运行视图并添加对特定命名空间的访问。
答案 0 :(得分:4)
我不建议你这样做。根本没有一种简单可靠的方法可以在不影响网站安全的情况下为他们提供这种能力。如果您信任您的用户,那么您可以这样做。如果不这样做,那么诸如DotLiquid
之类的模板引擎就更适合于此目的。
答案 1 :(得分:2)
您可以尝试更改剃刀视图引擎和相关类,以检查不允许的情况。
当生成源(视图引擎生成要编译的源文件)时,您必须手动检查它(通过解析c#或vb.net代码)。这是可能的,但不可行(真的)。
即使您设法解析并检查代码,您也必须识别您的代码(允许的代码)和客户代码(具有限制)。
最后你必须接受这样一个事实:除了使用另一个模板引擎之外你不能真正禁止任何其他事情。
,因为
var r = new Random();
顺便说一下,你可以试试另一件事。编写虚拟路径提供程序,并在运行时请求时转换AviatrixTemplate
中编写的客户模板。通过使用这条路线,你仍然使用剃须刀引擎,转换时只有很短的时间(仅限一次)。但是您的AviatrixTemplate
不会被点燃,您仍然需要检查不允许的代码。
PS:基本循环可能会为您的用户提供您想要的更多。例如,下面的代码允许创建一个类并调用它一次。他们可能使用完全限定的类名,也可能使用Activator.CreateInstance
。
@for (var r = new Random(); r != null; r = null)
{
@r.NextDouble()
}
只是不要打扰。
答案 2 :(得分:2)
有一个名为RazorEngine的项目,基于Microsoft的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 = "someone@somewhere.com" };
string result = Razor.Parse(template, model);
答案 3 :(得分:0)
我之前从未这样做过,但听起来你想让用户能够编写代码并编译使用,是吗?是的?
如果是这样,您可能需要查看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