Szablonowanie RazorEngine dla formularzy drukowanych
Opublikowano nowy przykład SampleRazorRunner, który demonstruje możliwości wykorzystania składni Razor w połączeniu z danymi uzyskanymi z Resto.Front.Api.
Ten przykład zawiera statyczną klasę RazorRunner, która posiada 2 metody UpdateRazorAssemblyReference oraz RunCompile.
-
UpdateRazorAssemblyReference(string restoApiAssemblyToUse, params string[] otherAssembliesToUse)- metoda ta pozwala na aktualizację listy zestawów (assembly), których zawartość będzie używana do kompilacji szablonu Razor.-
Pierwszy argument, restoApiAssemblyToUse, jest wymagany. Kompilator musi wiedzieć, która wersja API będzie używana.
-
Drugi argument jest opcjonalny. Dodatkowe zestawy należy podać, jeśli zawierają one wymagane dane, metody lub modele dla szablonu, których kompilator początkowo nie jest poinformowany, aby używać. Kilka bibliotek będzie zawsze używanych, ponieważ są niezbędne do prawidłowego działania kompilatora:
- mscorlib.dll
- netstandard.dll
- System.dll
- System.Core.dll
- RazorEngine.NetStandard.dll
- Microsoft.CSharp.dll
Metoda korzysta z klasy
ExternalAssemblyReferenceResolver, która opisuje proces aktualizacji referencji do zestawów dla Razor. -
-
RunCompile(string template, object model)- metoda ta odpowiada bezpośrednio za kompilację szablonu Razor.template- szablon w formie łańcucha znaków. Łańcuch może być napisany dynamicznie lub wczytany z plików. Typowe rozszerzenie dla szablonu Razor to .cshtml.model- obiekt modelu z określonym zestawem danych.
Warto zauważyć, że modele dla szablonów mogą być dwóch typów:
- Statyczne - w tym przypadku
modeljest przekazywany do kompilatora. Może być też konieczne przekazanie nazwy DLL zawierającej model doUpdateRazorAssemblyReferencewotherAssembliesToUse. - Dynamiczne - dynamicznie tworzony model jest przekazywany w polu
model. Na przykład:new { OrderNumber = 27, OrderId = PluginContext.Operations.GetOrders().Last().Id }. Jednak przy takim sposobie przekazywania danych szablon Razor musi zawierać deklaracje typów dla wszystkich przekazanych danych:(int)OrderNumber,(Guid)OrderId.
Przykład posiada również proste okno:

Pozwala ono dynamicznie zdefiniować szablon oraz zobaczyć wynikowy output lub informacje o błędach. SampleRazorRunner zawiera przykładowy plik ze składnią Razor, RazorTemplateSample.cshtml. Przykład ten wyświetla pewne dane dotyczące zamówienia.
Jeśli chcesz użyć tego mechanizmu w swoim pluginie, możesz skopiować plik RazorRunner.cs oraz dodać sekcję System.Runtime.CompilerServices.Unsafe w app.config.
Tworząc i używając szablonów Razor do drukowania w Resto.Front.Api, warto znać Markup Language.
Poniżej prosty przykład użycia tej funkcjonalności:
using RestoRazorRunner;
using System;
using System.Linq;
using System.Xml.Linq;
using Resto.Front.Api.Data.Print;
namespace Resto.Front.Api.SamplePlugin
{
public static class RazorRunnerSample
{
public static void RunCompileSample()
{
var os = PluginContext.Operations;
//Ustawienie prostego szablonu Razor
var razorTemplate = "@{" +
"\r\nvar os = Resto.Front.Api.PluginContext.Operations;" +
"\r\nvar order = os.GetOrderById((Guid)@Model.OrderId);" +
"\r\n}" +
"\r\n<doc>" +
"\r\n@string.Format(\"Zamówienie \u2116: {0}\", order.Number)" +
"\r\n</doc>";
var model = new SampleOrderModel { OrderId = os.GetOrders().Last().Id };
//Określenie, które biblioteki mają być używane.
RazorRunner.UpdateRazorAssemblyReference(
typeof(PluginContext).Assembly.ManifestModule.Name //Pobiera aktualną wersję API używaną przez plugin.
);
//Pobranie skompilowanego szablonu
var result = RazorRunner.RunCompile(razorTemplate, model);
//Drukowanie za pomocą Resto.Front.Api
var printingDevice = os.GetPrintingDeviceInfos().Last();
os.Print(printingDevice, new Document { Markup = XElement.Parse(result) });
}
public sealed class SampleOrderModel
{
public Guid OrderId { set; get; }
}
}
}
Alternatywnie, zamiast drukowania, można uzyskać w pełni sformatowany tekst używając operacji FormatDocumentOnPrintingDevice.