簡體   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