public class OrderModel { public string FirstName { get; set; } public string LastName { get; set; } public List<OrderItemModel> Items { get; set; } } public class OrderItemModel { public string ProductName { get; set; } public Decimal Price { get; set; } public int Qty { get; set; } }
, @Model.FirstName @Model.LastName! # - - ---------- ------ ------ ------ @for (var i = 0; i < Model.Items.Count; i++) { var item = Model.Items[i]; @String.Format( "{0} {1,-10} {2,6} {3,6} {4,6}\r\n", i + 1, @item.ProductName, @item.Price, @item.Qty, item.Price * item.Qty) } : @(((OrderModel)Model).Items.Sum(x => x.Price * x.Qty)) WBR, ACME team
public abstract class TemplateBase { public TextWriter Output { get; set; } public dynamic Model { get; set; } public abstract void Execute(); public virtual void Write(object value) { this.Output.Write(value); } public virtual void WriteLiteral(object value) { this.Output.Write(value); } }
var razorHost = new RazorEngineHost(new CSharpRazorCodeLanguage());
razorHost.DefaultBaseClass = typeof(TemplateBase).FullName; razorHost.DefaultNamespace = "StandaloneRazorDemo"; razorHost.DefaultClassName = "Template";
razorHost.NamespaceImports.Add("System"); razorHost.NamespaceImports.Add("System.Collections.Generic"); razorHost.NamespaceImports.Add("System.Linq"); razorHost.NamespaceImports.Add("System.Text");
var razorEngine = new RazorTemplateEngine(razorHost);
var templateText = File.ReadAllText("template.txt"); GeneratorResults generatorResults = null; using (var reader = new StringReader(templateText)) { generatorResults = razorEngine.GenerateCode(reader); }
if (!generatorResults.Success) { foreach (var error in generatorResults.ParserErrors) { Console.WriteLine( "Razor error: ({0}, {1}) {2}", error.Location.LineIndex + 1, error.Location.CharacterIndex + 1, error.Message); } throw new ApplicationException(); }
return generatorResults.GeneratedCode;
private static string CompileTemplate(CodeCompileUnit generatedCode) { var codeProvider = new CSharpCodeProvider(); #if DEBUG using (var writer = new StreamWriter("out.cs", false, Encoding.UTF8)) { codeProvider.GenerateCodeFromCompileUnit( generatedCode, writer, new CodeGeneratorOptions()); } #endif var outDirectory = "temp"; Directory.CreateDirectory(outDirectory); var outAssemblyName = Path.Combine(outDirectory, String.Format("{0}.dll", Guid.NewGuid().ToString("N"))); var refAssemblyNames = new List<string>(); refAssemblyNames.Add(new Uri(typeof(TemplateBase).Assembly.CodeBase).AbsolutePath); refAssemblyNames.Add("System.Core.dll"); refAssemblyNames.Add("Microsoft.CSharp.dll"); var compilerResults = codeProvider.CompileAssemblyFromDom( new CompilerParameters(refAssemblyNames.ToArray(), outAssemblyName), generatedCode); if (compilerResults.Errors.HasErrors) { var errors = compilerResults .Errors .OfType<CompilerError>() .Where(x => !x.IsWarning); foreach (var error in errors) { Console.WriteLine("Compiler error: ({0}, {1}) {2}", error.Line, error.Column, error.ErrorText); } throw new ApplicationException(); } return outAssemblyName; }
var assembly = Assembly.LoadFrom(outAssemblyName); var type = assembly.GetType("StandaloneRazorDemo.Template", true); var template = Activator.CreateInstance(type) as TemplateBase; using (var writer = new StringWriter()) { template.Output = writer; template.Model = GetModel(); template.Execute(); File.WriteAllText("out.txt", writer.ToString(), Encoding.UTF8); }
private static OrderModel GetModel() { var model = new OrderModel { FirstName = "", LastName = "" }; model.Items = new List<OrderItemModel>(); model.Items.Add(new OrderItemModel { ProductName = "Apple", Price = 4.95m, Qty = 1 }); model.Items.Add(new OrderItemModel { ProductName = "Kiwi", Price = 9.95m, Qty = 2 }); return model; }
, ! # - - ---------- ------ ------ ------ 1 Apple 4,95 1 4,95 2 Kiwi 9,95 2 19,90 : 24,85 WBR, ACME team
Source: https://habr.com/ru/post/111837/
All Articles