public abstract class TemplateBase { public StringBuilder Buffer { get; set; } public StringWriter Writer { get; set; } public TemplateBase() { Buffer = new StringBuilder(); Writer = new StringWriter(Buffer); } public abstract void Execute(); // : "@foo.Bar" public virtual void Write(object value) { // Don't need to do anything special // Razor for ASP.Net does HTML encoding here. WriteLiteral(value); } // : "<p>Foo</p>" public virtual void WriteLiteral(object value) { Buffer.Append(value); } // ... - , Razor , }
private RazorTemplateEngine SetupRazorEngine() { // 1. , C# RazorEngineHost host = new RazorEngineHost(new CSharpRazorCodeLanguage()); // 2. , . , host.DefaultBaseClass = typeof(TemplateBase).FullName; // 3. host.DefaultNamespace = "RazorOutput"; host.DefaultClassName = "Template"; // 4. (using) host.NamespaceImports.Add("System"); // 5. return new RazorTemplateEngine(host); }
// GeneratorResults razorResult = null; using (TextReader rdr = new StringReader( MyTemplatesString )) razorResult = _engine.GenerateCode(rdr); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); // string outputAssemblyName = String.Format("Temp_{0}.dll", Guid.NewGuid().ToString("N")); CompilerResults results = codeProvider.CompileAssemblyFromDom( new CompilerParameters(new string[] { typeof(Form1).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\") }, outputAssemblyName), razorResult.GeneratedCode);
Assembly asm = Assembly.LoadFrom(outputAssemblyName); if (asm == null) { MessageBox.Show(" "); } else { Type typ = asm.GetType("RazorOutput.Template"); if (typ == null) { MessageBox.Show(" RazorOutput.Template {0}", asm.FullName); } else { TemplateBase newTemplate = Activator.CreateInstance(typ) as TemplateBase; if (newTemplate == null) { MessageBox.Show(" RazorOutput.Template TemplateBase"); } else { // newTemplate // ... newTemplate.Execute(); string resultHTML = newTemplate.Buffer.ToString(); newTemplate.Buffer.Clear(); return resultHTML; // String, } } }
@functions { public string CustomerName { get; set; } public string ResetLink { get; set; } }
Source: https://habr.com/ru/post/173923/