Używam silnika Razor https://github.com/Antaris/RazorEngine do analizowania treści szablonów wiadomości e-mail. Czy można zdefiniować układ i dołączyć inne pliki .cshtml? na przykład wspólny nagłówek i stopka.Układy RazorEngine
Odpowiedz
mam wspólne szablony oraz pracę układu, przy pomocy tych dwóch stanowisk:
RazorEngine string layouts and sections?
To jest moje rozwiązanie:
Rozwiązanie 1: Layout
Użyj d ustawiając _Layout
@{
_Layout = "Layout.cshtml";
ViewBag.Title = Model.Title;
}
stopka
@section Footer
{
@RenderPart("Footer.cshtml")
}
Layout.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
Extend TemplateBase z metodą RenderPart
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);
}
}
Razor Config
Set BaseTemplateType do klasy TemplateBaseExtensions
TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
BaseTemplateType = typeof(TemplateBaseExtensions<>)
};
Razor.SetTemplateService(new TemplateService(templateConfig));
Edycja Rozwiązanie 2:
Jeśli używasz TemplateResolver.RenderPart nie potrzeba używać @include zamiast
stopka
@section Footer
{
@Include("Footer.cshtml")
}
Resolwer
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));
Aktualizacja przez The Muffin Man Określ szablon i renderowanie ciąg
var templateResolver = Razor.Resolve("Registration.cshtml");
return templateResolver.Run(new ExecuteContext());
Również ja, wraz z innymi pod tym linkiem https://github.com/Antaris/RazorEngine/issues/61 miał problemy z używaniem _Layout
natomiast Layout
pracował.
'_Layout' to stara składnia. Został zaktualizowany do "Układu" w przyszłej wersji.
Możesz łatwo zrobić wiele rzeczy za pomocą Razor; jednak ten konkretny projekt wydaje się odciągać wiele rzeczy, które możesz zrobić Razor (co jest dobre i złe). W twojej sytuacji brzmi to jakbyś był o wiele lepszy od wdrożenia własnego rozwiązania Razor (tak naprawdę nie jest tak źle), a potem możesz mieć szablony wyrzucające wyjątki lub pobierające inne treści całkiem łatwo.
Na przykład; przetaczanie własnego rozwiązania pozwala stworzyć klasę podstawową dla szablonów maszynki do golenia, które mogą ujawnić zdolność do wciągania "widoków cząstkowych" poprzez wywoływanie innych szablonów. Ponadto można wykonać sprawdzanie modelu i zgłaszać wyjątki, jeśli pewne właściwości są zerowe.
Najprostszym sposobem wdrożenia układ z RazorEngine jest zastępując co zwrot szablonu w @RenderBody() w układzie:
var finalHtml = layout.Replace(@"@RenderBody()", templateHtml);
np
swojej _Layout.cshtml z typowym @RenderBody()
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html>
<head>
</head>
<body>
<div>
@RenderBody()
</div>
</body>
</html>
szablonie RazorEngine MyTemplate.cshtml
@using RazorEngine.Templating
@inherits TemplateBase<myviewmodel>
<h1>Hello People</h1>
<p>@Model</p>
i gdziekolwiek zadzwonić szablon RazorEngine:
var TemplateFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EmailTemplates");
var template = File.ReadAllText(Path.Combine(TemplateFolderPath,"MyTemplate.cshtml"));
var layout = File.ReadAllText(Path.Combine(TemplateFolderPath, "_Layout.cshtml"));
var templateService = new TemplateService();
var templateHtml = templateService.Parse(template, myModel, null, null);
var finalHtml = layout.Replace(@"@RenderBody()", templateHtml);
- 1. Templating użyciu nowego RazorEngine API
- 2. TemplateCompilationError z RazorEngine i Layouts
- 3. RazorEngine vs RazorTemplates vs RazorMachine
- 4. Układaj układy na Androida i układy zagnieżdżone w ramach powiększania
- 5. CakePHP, rozszerzenia i układy
- 6. rekurencyjne układy z Handlebars.js
- 7. Układy Android pod podfolderami
- 8. Planarne układy wykresów
- 9. układy w expressjs
- 10. PlantUML różne układy
- 11. pyside pokaż/ukryj układy
- 12. RazorEngine parse rzuca Nie można skompilować
- 13. dostosowywania układy slajdów w slidify
- 14. Różne układy wierszy w ListView
- 15. Układy różnych modeli telefonów komórkowych
- 16. Android Organizuj układy w podkatalogach
- 17. Układy EJS w Express 3
- 18. MarionetteJS: Regiony aplikacji a układy
- 19. Jak przełączać układy w Angular2
- 20. Jak debugować układy Swapu Java
- 21. Jak wyprowadzać surowy html podczas korzystania RazorEngine (NIE z MVC)
- 22. Korzystanie-Oświadczenie w RazorEngine (bez HtmlHelper od MVC)
- 23. Błąd RazorEngine podczas próby wysłania wiadomości e-mail
- 24. Jak często używane są układy Xilinx?
- 25. Silnik szablonów ekspresowych 4 obsługujących układy
- 26. Różne układy podrzędny w viewDidLoad i viewWillAppear
- 27. dwa różne układy na jednej czynności
- 28. Zmiana rozmiaru układy dynamiczne z ViewFlipper
- 29. Odpowiednik iOS dla Android Fragmenty/układy
- 30. Jak zaimplementować układy inne niż domyślneLayout
starałem się wdrożyć rozwiązanie w blogu MS powyżej Wciąż dostaję stackoverflow wyjątek. Spędziłem cały dzień na tym. –
Mogę wysłać ci szybką aplikację, którą zrzucę razem, więc masz pomysł: – ministrymason
https://rapidshare.com/files/3962348204/RazorEngineConsoleApplication.zip Został wyrzucony razem, ale na pewno wpadniesz na pomysł. Podstawą aplikacji jest RazorEngineConsoleApplication \ bin \ Debug, więc skopiowałem tam szablony. Aby trzymać się przykładu, który napisałem. – ministrymason