繁体   English   中英

我怎样才能隔离Razor Views?

[英]How can i isolate Razor Views?

有没有办法向人们公开Razor语法和(自定义)助手,但是说...不允许他们创建代码块,或者只是限制他们使用助手并且不给他们执行纯粹的权力视图中的C#代码?

欢迎任何有关类似解决方案的想法和指示!

更新: //我想让用户有权编写自己的HTML并只能访问html助手列表。 主要是默认的和我创建的。

例如,我不希望它们能够在@{ //code }块中执行代码,并且没有using@model (不确定这个)只能访问@Html.* @if else for foreach

或者更好的是,让他们只访问特定的命名空间(这只是一个想法)

更新://经过一些测试后,我发现RazorEngine尽可能接近我正在尝试做的事情:在隔离环境中运行视图并添加对特定命名空间的访问。

我不建议你这样做。 根本没有一种简单可靠的方法可以在不影响网站安全的情况下为他们提供这种能力。 如果您信任您的用户,那么您可以这样做。 如果你不这样做,那么像DotLiquid这样的模板引擎就更适合这个目的了。

您可以尝试更改剃刀视图引擎和相关类以检查不允许的情况。

生成源时(视图引擎生成要编译的源文件),您必须手动检查它(通过解析c#或vb.net代码)。 这是可能的,但不可行(真的)。

即使您已设法解析并检查代码,您也必须识别您的代码(允许的代码)和客户代码(具有限制)。

最后,你必须接受这样一个事实:除了使用另一个模板引擎之外你不能真正禁止任何事情。

因为

  1. 您的客户将找到一种方式使他们的观点看起来像您的。
  2. 你不能限制大多数基本的必需功能,如var r = new Random();
  3. 您无法估计最基本的要求
  4. 当您需要使用自定义库时,您不能拒绝客户

顺便说一句,你可以试试另一件事。 编写虚拟路径提供程序,并在AviatrixTemplate时请求时转换用AviatrixTemplate编写的客户模板。 通过使用这条路线,你仍然使用剃须刀引擎,转换时只有很短的时间(仅限一次)。 但是您的AviatrixTemplate不会被高亮显示,您仍然需要检查不允许的代码。

PS:基本循环可能会为您的用户提供您想要的更多。 例如,下面的代码允许创建一个类并调用它一次。 他们可能使用完全限定的类名或可能使用Activator.CreateInstance

@for (var r = new Random(); r != null; r = null)
{
    @r.NextDouble()
}

只是不要打扰。

有一个名为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);

我以前从未这样做过,但听起来你想让用户能够编写代码并编译使用,是吗?

如果是这样,您可能需要查看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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM