2013-02-23 1 views
5

Existe-t-il un moyen d'exposer la syntaxe de Razor et les assistants (personnalisés) aux utilisateurs, mais ne leur permettez pas de créer des blocs de code ou de les limiter à l'utilisation des helpers? exécuter du code C# pur dans les vues?Comment puis-je isoler Razor Views?

Toutes les idées et les pointeurs vers des solutions similaires sont les bienvenus!

mise à jour: // Je voudrais donner aux utilisateurs le pouvoir d'écrire leur propre HTML et d'accéder uniquement à une liste d'aides html. Principalement ceux par défaut et ceux que je crée.

Par exemple, je ne veux pas qu'ils soient en mesure d'exécuter du code dans @{ //code } blocs et pas non plus using et @model (pas sûr de celui-ci) seulement accès à @Html.*@ifelseforforeach

ou mieux cependant, donnez-leur l'accès seulement aux espaces de noms spécifiques (ceci juste une pensée tho)

mise à jour: // Après quelques essais, j'ai découvert que RazorEngine fait aussi près que j'essaye À faire: exécuter les vues dans un environnement isolé et ajouter l'accès à des espaces de noms spécifiques.

+0

s'il vous plaît ajouter des exemples d'utilisateurs activité autorisée et son effet. devrait être d'au moins 5 car il est difficile de comprendre complètement la portée d'une telle approche. –

+0

mis à jour. et ce qui devrait être au moins 5? – Aviatrix

+0

votre question est intrigante mais difficile à comprendre. Alors donnez des exemples de blocs de code que vous voudriez que l'utilisateur puisse entrer et codez les blocs que vous ne voudriez pas qu'ils puissent entrer –

Répondre

2

Il existe un projet appelé RazorEngine, basé sur le Razor de Microsoft, qui vous permet d'analyser cette syntaxe sans avoir à retourner une vue MVC. Voici comment il est utilisé:

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

Vous pouvez également spécifier une base de modèle personnalisé, qui devrait vous permettre de définir uniquement le Html Helpers que vous voulez exposer à vos utilisateurs:

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

les modèles isolés dans RazorEngine est exactement ce que je cherchais! Merci! – Aviatrix

4

Je ne vous recommande pas de le faire. Il n'y a tout simplement pas un moyen facile et fiable de leur donner cette capacité sans compromettre la sécurité de votre site. Si vous faites confiance à vos utilisateurs, vous pouvez le faire. Si vous ne le faites pas, un moteur de template tel que DotLiquid est quelque chose de bien plus approprié à cette fin.

+0

Darin, je ne veux pas implémenter un autre moteur de template, j'ai déjà Razor et je veux tirer parti de la syntaxe géniale qu'il fournit, et limiter les fonctions que les gens peuvent exécuter. – Aviatrix

+3

Faites-vous confiance à vos utilisateurs? Il semble que vous ne le faites pas parce que vous demandez comment les empêcher de faire certaines actions. J'ai peur que Razor n'ait pas été conçu dans ce but. –

+0

Merci de mettre en évidence DotLiquid, semble une grande bibliothèque à cet effet –

0

Je n'ai jamais fait cela auparavant, mais il semble que vous vouliez donner aux utilisateurs la possibilité d'écrire du code et de le compiler pour l'utiliser, oui? Si oui, vous pouvez regarder dans la classe CSharpCodeProvider, la classe RazorTemplateEngine et l'espace de noms System.CodeCom.Compiler.

Jetez un oeil ici pour des informations sur ces classes:

CSharpCodeProvider: http://support.microsoft.com/kb/304655

RazorTemplateEngine: http://msdn.microsoft.com/en-us/library/system.web.razor.razortemplateengine(v=vs.111).aspx

+0

Hey, je ne veux pas qu'ils compilent rien, juste la possibilité de créer des modèles et être capable d'utiliser des boucles de base et aide html – Aviatrix

+0

Si cela implique d'utiliser le code que vous avoir écrit, vous devrez compiler leur code afin qu'ils puissent utiliser votre code. Vous pouvez pendant le processus filtrer les espaces de noms indésirables, etc ...Si vous voulez juste imiter Razor, vous devrez compiler le Razor ou l'analyser vous-même. – rhughes

2

vous pouvez essayer de changer le moteur de vue rasoir et les classes associées pour vérifier les situations non admises.

Lorsque la source est générée (moteur de vue génère un fichier source à compiler), vous devez vérifier manuellement (par l'analyse syntaxique C# ou code vb.net). C'est possible, mais pas réalisable (vraiment).

Même si vous avez réussi à analyser et vérifier le code, vous devez identifier votre code (qui est autorisé) et le code client (qui a des restrictions).

A la fin, vous devez accepter le fait que vous ne pouvez pas vraiment interdire quoi que ce soit d'autre que d'utiliser un autre moteur de modèle.

parce

  1. Vos clients trouveront un moyen de faire connaître leurs vues ressemblent à la vôtre.
  2. Vous ne pouvez pas limiter la plupart des fonctionnalités de base requises comme var r = new Random();
  3. Vous ne pouvez pas estimer ce que la plupart des exigences de base sont
  4. vous ne pouvez pas dire non à vos clients quand ils ont besoin d'utiliser leurs bibliothèques personnalisées

Soit dit en passant , vous pouvez essayer autre chose. Ecrivez un fournisseur de chemin d'accès virtuel et convertissez les modèles client écrits en AviatrixTemplate lorsque demandé par runtime. En utilisant cette route, vous utilisez toujours un moteur de rasoir, ne perdez que peu de temps lors de la conversion (c'est une seule fois). Mais votre AviatrixTemplate ne sera pas hilighted, et vous devez toujours vérifier le code non autorisé. PS: une boucle de base peut donner à vos utilisateurs plus que ce que vous voulez. par exemple, le code suivant permet la création d'une classe et l'appelle pour une fois. ils peuvent utiliser un nom de classe entièrement qualifié ou utiliser Activator.CreateInstance.

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

ne vous embêtez pas.