2013-02-23 4 views
5

Razorの構文と(カスタム)ヘルパーを人に公開する方法はありますか?コードブロックを作成したり、ヘルパーの使用を制限したり、ビューで純粋なC#コードを実行しますか?どのようにしてRazor Viewsを分離できますか?

似たようなソリューションへのアイデアや指針をお待ちしております。

更新: //ユーザーに独自のHTMLを作成し、HTMLヘルパーの一覧にしかアクセスできないようにしたいと考えています。主にデフォルトのものと私が作成するもの。

たとえば、私は彼らが@Html.*@ifelseforforeach

以上にも@{ //code }ブロックと なしusing@model(これについてはよく分からない) のみアクセス権を持つ内のコードを実行することができるようにしたくありません特定の名前空間だけにアクセスできるようにしてください(これは単なる考えです)

update:// いくつかのテストの後、私はRazorEngineが私が試みているものに近いことを発見しました目的:隔離された環境でビューを実行し、特定の名前空間にアクセスを追加する。

+0

ユーザーの例を追加してください:

string template = "Hello @Model.Name! Welcome to Razor!"; string result = Razor.Parse(template, new { Name = "World" }); 

はまた、あなたは、あなたのユーザーに公開するだけのHTMLヘルパーを定義できるようにする必要がありカスタマイズされたテンプレートをベースに、指定することができます許可された活動とその効果。そのようなアプローチの範囲を完全に理解することは難しいので、少なくとも5でなければなりません。 –

+0

が更新されました。何が少なくとも5であるべきですか? – Aviatrix

+0

あなたの質問は興味深いですが、詳細を知ることは難しいです。あなたが入力したくないブロックを入力してコードブロックを入力できるようにするコードブロックの例を挙げてください。 –

答えて

2

MicrosoftのRazorに基づいて構築されたRazorEngineというプロジェクトがあります。このプロジェクトでは、MVCビューを返すコンテキストではなくその構文を解析できます。ここではそれが使われている方法は次のとおりです。

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); 
+0

RazorEngineの隔離されたテンプレートは、私が探していたものです!ありがとう! – Aviatrix

4

私はそうすることをお勧めしません。サイトのセキュリティを犠牲にすることなく、この機能を簡単かつ確実に提供する方法はありません。あなたがあなたのユーザーを信頼するなら、あなたはそれを行うことができます。あなたがそうでないなら、DotLiquidのようなテンプレートエンジンは、この目的にはるかに適しています。

+0

ダーリン、私は別のテンプレートエンジンを実装したくない、私は既にRazorを持っています。私はそれが提供するすばらしい構文を利用したいと思います。 – Aviatrix

+3

あなたはユーザーを信頼しますか?あなたが特定の行動をするのを防ぐ方法を尋ねているので、あなたはそうしないようです。私は、かみそりがこの目的のために設計されていないことを恐れています。 –

+0

DotLiquidを強調表示していただきありがとうございます。この目的のための素晴らしい図書館です –

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

+0

ねえ、私はそれらに何かをコンパイルしたくないのです。テンプレートを作成し、基本ループとHTMLヘルパーを使用できるようにしてください。 – Aviatrix

+0

あなたのコードを使用するためにコードをコンパイルする必要があります。プロセス中に不要な名前空間などをフィルタリングすることができます。Razorを模倣したいだけなら、Razorをコンパイルするか、それとも自分で解析する必要があります。 – rhughes

2

あなたが許可されない状況をチェックするためにかみそりビューエンジンおよび関連するクラスを変更しようとするかもしれません。

ソースが生成されると(ビューエンジンがソースファイルを生成してコンパイルするとき)、手動でチェックする必要があります(c#またはvb.netコードを解析して)。可能ですが、実現可能ではありません(実際には)。

コードを解析してチェックしても、コード(許可されている)と顧客コード(制限がある)を特定する必要があります。

最後に、別のテンプレートエンジンを使用する以外のことを本当に許可できないという事実を受け入れる必要があります。

  1. ので、あなたの顧客は彼らの見解は、あなたのように見えるようにする方法を見つけるだろう。
  2. あなたは、あなたが最も基本的な要件は、彼らがちなみに自分のカスタムライブラリ

を使用する必要があるとき、あなたの顧客にノーと言うことはできません

  • が何であるかを推定することはできませんvar r = new Random();
  • のような最も基本的な必要な機能を制限することはできませんあなたは別のことを試みるかもしれません。仮想パスプロバイダを作成し、実行時に要求された場合AviatrixTemplateで書かれた顧客テンプレートを変換します。このルートを使用することで、あなたは引き続き剃刀エンジンを使用します。変換するときにわずかな時間しかかかりません(1回だけです)。しかし、あなたのAviatrixTemplateは馬鹿にされず、あなたはまだ許可されていないコードをチェックする必要があります。

    PS:基本ループは、ユーザーが望むよりも多くのユーザーに与えることができます。たとえば、次のコードでは、クラスを作成して一度に呼び出すことができます。完全修飾クラス名を使用することも、Activator.CreateInstanceを使用することもできます。

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

    ただ気にしないでください。

  • 関連する問題