2015-11-06 1 views
8

J'utilise Razor Engine pour compiler dynamiquement ma vue de rasoir à partir de la base de données. Maintenant en utilisant Razor Engine 3.7.3. J'ai vu quelques messages sur la façon de lire html helper et de le compiler, mais c'était pour l'ancienne version du moteur de rasoir.Résoudre html helper

J'ai lu environ ITemplateServiceConfiguration, mais je ne peux pas vraiment comprendre comment cela fonctionne soit.

Ma question est, comment puis-je runcompile() razorengine (v3.7.3) avec succès @Html (helper Html), @url (URL Helper), et @section (comme @section Scripts, @section en vedette) dans le contenu html de ma base de données?

Les choses que j'ai faites jusqu'ici. J'ai essayé d'implémenter un code que j'ai reçu d'un autre post. Le code était destiné à une ancienne version du moteur de rasoir. Il a suggéré que nous créons notre propre classe d'aide:

public class RazorHtmlHelper 
{ 
    public IEncodedString Partial(string viewName) 
    { 
     ITemplate template = RazorEngine.Razor.Resolve(viewName); 

     ExecuteContext ec = new ExecuteContext(); 

     RawString result = new RawString(template.Run(ec)); 

     return result; 
    } 
} 

public class RazorUrlHelper 
{ 
    public string Encode(string url) 
    { 
     return System.Uri.EscapeUriString(url); 
    } 
} 

Et puis il a suggéré de créer notre propre templating

public class RazorTemplateBase<T> : TemplateBase<T> 
{ 
    private RazorUrlHelper _urlHelper = new RazorUrlHelper(); 

    private RazorHtmlHelper _htmlHelper = new RazorHtmlHelper(); 

    public RazorUrlHelper Url 
    { 
     get 
     { 
      return this._urlHelper; 
     } 
    } 

    public RazorHtmlHelper Html 
    { 
     get 
     { 
      return this._htmlHelper; 
     } 
    } 
} 

Et avant l'analyse, nous devons définir notre config:

Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() 
{ 
    BaseTemplateType = typeof(RazorTemplateBase<>) 
}; 
)); 

result = RazorEngine.Razor.Parse(templateText, model); 

Il n'y a pas de problème avec RazorUrlHelper, mais RazorHtmlHelper ne peut pas lire correctement ces codes car il est obsolète:

ITemplate template = RazorEngine.Razor.Resolve(viewName); 
ExecuteContext ec = new ExecuteContext(); 
RawString result = new RawString(template.Run(ec)); 

Les codes ci-dessus sont de this post

+0

pouvez-vous montrer ce que vous avez fait jusqu'à présent? Alors que nous pouvons vous aider mieux –

+0

Ok je l'ai édité, s'il vous plaît examiner. –

+0

Copie possible de [RazorEngine WebApiTemplateBase @ Url.Content()] (http://stackoverflow.com/questions/32461041/razorengine-webapitemplatebase-url-content) – matthid

Répondre

-1

Je ne suis pas tout à fait sûr que mes suggestions directement à résoudre votre problème. Dans mon expérience professionnelle essayer de tirer parti des classes dépréciées ne donne pas de résultats positifs. Personnellement, je n'essaierais pas de rendre les vues directement à partir d'une base de données. Si j'étais dans votre position en utilisant le moteur de vue rasoir avec MVC4, je voudrais abandonner votre approche, suivez ces étapes.

  1. Faites un clic droit sur votre projet et mettez à jour MVC4 et toutes les bibliothèques js/dll/incluses avec la dernière version en utilisant nuget.
  2. Créez des ensembles d'objets Modèle contenant des variables pour stocker toutes les informations que vous allez extraire de la base de données. Exploitez l'héritage ou concevez-les de manière à ce qu'ils soient utilisés efficacement sur demande.
  3. Créez vos vues principales et partielles pour votre projet MVC qui empêchent le plus efficacement tout code frontal dupliqué. Si ces vues vont principalement renvoyer des réponses HTML, définissez vos actions de contrôleur sur un ActionResult() pointant vers les vues principales pour votre application. Remplissez votre objet de modèle avec toutes les données dont il a besoin de la base de données dans ces actions de contrôleur et passez les objets de modèle remplis à votre vue principale.
  4. Dans vos vues partielle et principale, vous pouvez définir cet objet modèle en tant que modèle principal en haut de la vue et transmettre les variables du modèle en tant que paramètres à vos HTMLHelpers.
  5. Créez vos objets HTML Helper qui prennent ces variables de modèle en tant que paramètres et définissez leurs espaces de noms dans votre fichier Views/web.config. Dans cet exemple, j'ai utilisé l'espace de noms System.Web.HtmlHelpers. Si vous ne le faites pas, vous ne pourrez pas tirer parti des aides personnalisées en dehors des espaces de noms de base de vos vues.

    <system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
        <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
        <namespaces> 
        <add namespace="System.Web.Mvc" /> 
        <add namespace="System.Web.Mvc.Ajax" /> 
        <add namespace="System.Web.Mvc.Html" /> 
        <add namespace="System.Web.Optimization"/> 
        <add namespace="System.Web.Routing" /> 
        <add namespace="System.Web.HtmlHelpers" /> 
        </namespaces> 
        </pages> 
    </system.web.webPages.razor> 
    
    1. Dans vos classes d'espace de noms HTMLHelpers, créer MVCHtmlString ou d'autres méthodes MVC qui prennent vos paramètres du modèle de base de données et de les traduire en travail et le fonctionnement HTML/JSON ou XML. Référencez ces aides HTML personnalisées dans vos vues partielle et principale.

Si vous implémentez vos HTMLHelpers de cette façon, vous êtes abstraire de votre JIT de code compilé (tout code de vue) avec la logique qui accède à des données et convertit les données de base de données structurées en HTML visible. Dans l'exemple ci-dessus que vous présentez, JIT compilera la plupart de la logique de vos vues lors de l'exécution, ce qui est très coûteux en termes de performances. MVC a été conçu de telle sorte que vous puissiez éviter de prendre tous ces frais généraux. Si vous créez des assistants HTML puissants qui existent dans des bibliothèques précompilées, vous pouvez rendre votre code d'affichage extrêmement petit et simple.