ASP.NET MVC से अलग से रेजर का उपयोग करना

मेरी छात्र गतिविधि की प्रकृति से, मुझे अक्सर विभिन्न प्रयोगशाला और शब्द पत्र लिखने पड़ते हैं। इन कार्यों का एक अभिन्न अंग (जैसा कि 80% व्यापार प्रोग्रामिंग कार्यों में है) डेटाबेस में पाए जाने वाले तत्वों या लंबी और जटिल ऑपरेशन पर एक रिपोर्ट को संकलित करने के लिए कोड है। .NET फ्रेमवर्क के भीतर डेस्कटॉप प्रोग्रामिंग में, इस तरह की समस्याओं को हल करने के विभिन्न तरीके हैं:

मैं बाद की बात करूंगा।

सबसे सरल और स्पष्ट विकल्प HTML स्ट्रिंग को मैन्युअल रूप से जनरेट करना है। जो लोग अभी मंच से परिचित हो रहे हैं, वे तुरंत स्ट्रिंग वस्तुओं को प्राप्त करना शुरू कर देंगे, और जो लोग दस्तावेज पढ़ते हैं, वे स्ट्रिंगबर्ल क्लास पर ध्यान देंगे। किसी भी मामले में, String.Format हमेशा रिपोर्ट उत्पन्न करने का सबसे सुविधाजनक तरीका नहीं है। लेकिन ASP.NET MVC का उपयोग करने वाले प्लेटफ़ॉर्म पर सहयोगियों को रेज़र प्रस्तुति इंजन के लिए पर्याप्त नहीं मिल सकता है। और यहां यह सवाल उठता है: अपने स्वयं के प्रयोजनों के लिए ASP.NET रेजर की शक्ति का उपयोग क्यों नहीं किया जाता है?
सबसे पहले, आपको System.Web.Razor विधानसभा को कनेक्ट करना होगा। इसकी आपूर्ति ASP.NET MVC द्वारा की जाती है, इसलिए यदि लक्ष्य कंप्यूटर में यह स्थापित नहीं है, तो आपको आवश्यक dll की स्थानीय प्रतिलिपि का ध्यान रखना चाहिए।
उस बेस क्लास को डिक्लेयर करें, जहां से हमारा व्यू विरासत में मिला होगा।
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); } 

जैसा कि आप जानते हैं, .NET मक्खी पर संकलन कोड का समर्थन करता है। इस सुविधा का उपयोग रेजर द्वारा किया जाता है। इसलिए, हमारे मामले में, हमें फ़ाइल को टेम्पलेट के साथ पढ़ना होगा और इसे अलग असेंबली में सहेजना होगा।
  //    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; } } 

बाद के मामले में, आपको टेम्पलेट्स की गतिशील पीढ़ी को छोड़ना होगा, लेकिन इस डेटा तक पहुंचना बहुत आसान है।

इसलिए, सरल आंदोलनों की मदद से, हमने एमएस से एक शक्तिशाली और सुविधाजनक टूल का उपयोग करके "एक और" टेम्पलेट इंजन लिखने के प्रलोभन से बचा लिया।


1 यह माना जाता है कि चूंकि आप .NET फ्रेमवर्क के तहत लिख रहे हैं, इसलिए इसे क्लाइंट पर इंस्टॉल किया गया है। लेकिन कार्यालय, क्रिस्टल रिपोर्ट, एसक्यूएल सर्वर, विजुअल स्टूडियो - जरूरी नहीं है


Source: https://habr.com/ru/post/In173923/


All Articles