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.
Réponses
Trop de publicités?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?
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.
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.