46 votes

Schémas RazorEngine

J'utilise le moteur Razor https://github.com/Antaris/RazorEngine pour analyser le corps de mes modèles de courrier électronique. Est-il possible de définir une mise en page et d'inclure d'autres fichiers .cshtml? par exemple un en-tête commun et un pied de page.

55voto

ministrymason Points 706

J'ai eu modèles communs ainsi qu'un plan de travail, avec l'aide de ces deux postes:

RazorEngine chaîne de mises en page et les articles?

http://blogs.msdn.com/b/hongyes/archive/2012/03/12/using-razor-template-engine-in-web-api-self-host-application.aspx

C'est ma solution:

Solution 1: Mise en page

Utilisé par la configuration _Layout

@{
    _Layout = "Layout.cshtml";
    ViewBag.Title = Model.Title;
 }

Le pied de page

@section Footer 
{
   @RenderPart("Footer.cshtml")
}

De mise en page.cshtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html>
    <head>
    </head>
    <body>
        <div id="content">
            @RenderBody()
        </div> 
        @if (IsSectionDefined("Footer"))
        { 
            <div id="footer">
                @RenderSection("Footer")
            </div>
        }
    </body> 
</html>

TemplateBaseExtensions

Étendre TemplateBase avec un RenderPart Méthode

public abstract class TemplateBaseExtensions<T> : TemplateBase<T>
{
    public string RenderPart(string templateName, object model = null)
    {
        string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", templateName);
        return Razor.Parse(File.ReadAllText(path), model);
    }
}

Rasoir Config

Ensemble BaseTemplateType à votre TemplateBaseExtensions classe

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
     BaseTemplateType = typeof(TemplateBaseExtensions<>)
};

Razor.SetTemplateService(new TemplateService(templateConfig));

Edit Solution 2:

Si vous utilisez un TemplateResolver. RenderPart n'est pas nécessaire d'utiliser le @Include au lieu

Le pied de page

@section Footer 
{
   @Include("Footer.cshtml")
}

Résolveur

public class TemplateResolver : ITemplateResolver
{
    public string Resolve(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", name);
        return File.ReadAllText(path, System.Text.Encoding.Default);
    }
}

Config

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
     Resolver = new TemplateResolver()
};
Razor.SetTemplateService(new TemplateService(templateConfig));

Mise à jour par Le Muffin Man Spécifiez un modèle et de rendre une chaîne de caractères

var templateResolver = Razor.Resolve("Registration.cshtml");
return templateResolver.Run(new ExecuteContext());

Aussi, j'ai, avec d'autres personnes sur ce lien https://github.com/Antaris/RazorEngine/issues/61 eu des problèmes avec l'aide d' _Layout alors qu' Layout a travaillé.

'_Layout' est l'ancienne syntaxe. Il a été mis à jour à la "Mise en page" dans une version future.

1voto

Tejs Points 23834

Vous pouvez facilement faire beaucoup de choses avec de Rasoir; toutefois, ce projet me semble de faire abstraction de beaucoup de Rasoir moteur de choses que vous pourriez faire (qui est à la fois bon et mauvais). Dans votre situation, il semble que vous serait beaucoup mieux de mettre en œuvre votre propre Rasoir solution (c'est en fait pas si mal que ça) et puis vous pouvez avoir vos modèles de lancer des exceptions ou tirer dans d'autres contenus assez facilement.

Par exemple, rouler votre propre solution vous permet de vous faire une classe de base pour que votre rasoir modèles qui peuvent exposer la capacité à tirer dans "vues partielles", en invoquant d'autres modèles. En outre, vous pouvez faire le modèle de la vérification et de lancer des exceptions si certaines propriétés sont nulles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X