2015-11-06 6 views
8

हल करें मैं डेटाबेस से अपने रेज़र दृश्य को गतिशील रूप से संकलित करने के लिए Razor Engine का उपयोग कर रहा हूं। अब रेजर इंजन का उपयोग कर रहा हूँ 3.7.3। मैंने एचटीएमएल सहायक को पढ़ने और इसे संकलित करने के बारे में कुछ पोस्टिंग देखी, लेकिन यह रेजर इंजन के पुराने संस्करण के लिए था।एचटीएमएल सहायक

मैंने ITemplateServiceConfiguration पढ़ा है, लेकिन मैं वास्तव में समझ नहीं सकता कि यह कैसे काम करता है।

मेरे सवाल है, मैं कैसे @Html (एचटीएमएल सहायक), @url (यूआरएल हेल्पर), और @section (जैसे @Section स्क्रिप्ट से() razorengine (v3.7.3) सफलतापूर्वक runcompile कर सकते हैं, @Section विशेष रुप से प्रदर्शित) मेरे डेटाबेस से एचटीएमएल सामग्री में?

जो कुछ मैंने अभी तक किया है। मैंने एक कोड को लागू करने की कोशिश की जिसे मुझे एक और पोस्ट से मिला। कोड रेजर इंजन के पुराने संस्करण के लिए था। उन्होंने सुझाव दिया कि हम अपने ही सहायक वर्ग बनाने के लिए:

public class RazorHtmlHelper 
{ 
    public IEncodedString Partial(string viewName) 
    { 
     ITemplate template = RazorEngine.Razor.Resolve(viewName); 

     ExecuteContext ec = new ExecuteContext(); 

     RawString result = new RawString(template.Run(ec)); 

     return result; 
    } 
} 

public class RazorUrlHelper 
{ 
    public string Encode(string url) 
    { 
     return System.Uri.EscapeUriString(url); 
    } 
} 

और फिर उसने हमारे अपने templating बनाने के लिए सुझाव:

public class RazorTemplateBase<T> : TemplateBase<T> 
{ 
    private RazorUrlHelper _urlHelper = new RazorUrlHelper(); 

    private RazorHtmlHelper _htmlHelper = new RazorHtmlHelper(); 

    public RazorUrlHelper Url 
    { 
     get 
     { 
      return this._urlHelper; 
     } 
    } 

    public RazorHtmlHelper Html 
    { 
     get 
     { 
      return this._htmlHelper; 
     } 
    } 
} 

और पार्स करने से पहले, हम अपने config निर्धारित करने की आवश्यकता:

Razor.SetTemplateService(new TemplateService(new TemplateServiceConfiguration() 
{ 
    BaseTemplateType = typeof(RazorTemplateBase<>) 
}; 
)); 

result = RazorEngine.Razor.Parse(templateText, model); 

RazorUrlHelper के साथ कोई समस्या नहीं है, लेकिन RazorHtmlHelper इन कोडों को ठीक से नहीं पढ़ सकता है क्योंकि इसे बहिष्कृत किया गया है:

ITemplate template = RazorEngine.Razor.Resolve(viewName); 
ExecuteContext ec = new ExecuteContext(); 
RawString result = new RawString(template.Run(ec)); 

ऊपर कोड से this post

+0

क्या आप दिखा सकते हैं कि आपने अभी तक क्या किया है? SO ताकि हम आपको बेहतर मदद कर सकें –

+0

ठीक है मैंने इसे संपादित किया है, कृपया समीक्षा करें। –

+0

संभावित डुप्लिकेट [RazorEngine WebApiTemplateBase @ Url.Content()] (http://stackoverflow.com/questions/32461041/razorengine-webapitemplatebase-url-content) – matthid

उत्तर

-1

हैं मैं पूरी तरह यकीन है कि मेरी सुझाव सीधे अपनी समस्या को हल नहीं कर रहा हूँ। मेरे पेशेवर अनुभव में बहिष्कृत वर्गों का लाभ उठाने का प्रयास सकारात्मक परिणाम नहीं देता है। मैं व्यक्तिगत रूप से डेटाबेस से सीधे विचार प्रस्तुत करने की कोशिश नहीं करता। अगर मैं आपकी स्थिति में एमवीसी 4 के साथ रेजर व्यू इंजन का लाभ उठा रहा था, तो मैं आपके दृष्टिकोण को इन चरणों का पालन करने के लिए छोड़ दूंगा।

  1. अपनी परियोजना पर राइट क्लिक करें और एमवीसी 4 अपडेट करें और सभी को जेएस/डीएल/पुस्तकालयों को नवीनतम संस्करण में nuget का उपयोग करके शामिल किया गया है।
  2. मॉडल ऑब्जेक्ट्स के सेट बनाएं जिनमें वे सभी डेटाबेस हैं जो आप डेटाबेस से खींच रहे हैं, के लिए चर शामिल हैं। लीवरेज विरासत या उन्हें इस तरह से डिजाइन करें कि वे प्रति अनुरोध के आधार पर कुशलता से उपयोग किए जाते हैं।
  3. अपने एमवीसी प्रोजेक्ट के लिए अपने मुख्य मास्टर और आंशिक दृश्य बनाएं जो सबसे अधिक कुशलता से किसी भी डुप्लिकेट फ्रंट एंड कोड को रोकें। यदि ये विचार मुख्य रूप से HTML प्रतिक्रियाएं वापस करने जा रहे हैं, तो अपने कंट्रोलर क्रियाओं को अपने एप्लिकेशन के लिए मास्टर व्यू पर इंगित करने के लिए एक ActionResult() पर सेट करें। अपने मॉडल ऑब्जेक्ट को उन सभी डेटा के साथ भरें जिन्हें इसे इन नियंत्रक कार्यों में डेटाबेस से चाहिए और भरे मॉडल ऑब्जेक्ट्स को अपने मास्टर व्यू में पास करें।
  4. अपने आंशिक और मास्टर विचारों में, आप इस मॉडल ऑब्जेक्ट को दृश्य के शीर्ष पर मुख्य मॉडल के रूप में परिभाषित कर सकते हैं और मॉडल चर को अपने HTMLHelpers के पैरामीटर के रूप में पास कर सकते हैं।
  5. अपनी एचटीएमएल हेल्पर ऑब्जेक्ट्स बनाएं जो इन मॉडल वैरिएबल को पैरामीटर के रूप में लेते हैं, और अपने नेमस्पेस को अपने दृश्य/web.config फ़ाइल में परिभाषित करते हैं। इस उदाहरण में मैंने नेमस्पेस सिस्टम.Web.HtmlHelpers का उपयोग किया था। यदि आप ऐसा नहीं करते हैं, तो आप अपने विचारों में आधार नामस्थानों के बाहर किसी भी कस्टम सहायतागार का लाभ उठाने में सक्षम नहीं होंगे।

    <system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
        <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
        <namespaces> 
        <add namespace="System.Web.Mvc" /> 
        <add namespace="System.Web.Mvc.Ajax" /> 
        <add namespace="System.Web.Mvc.Html" /> 
        <add namespace="System.Web.Optimization"/> 
        <add namespace="System.Web.Routing" /> 
        <add namespace="System.Web.HtmlHelpers" /> 
        </namespaces> 
        </pages> 
    </system.web.webPages.razor> 
    
    1. अपने HTMLHelpers नाम स्थान कक्षाओं में, MVCHtmlString या अन्य MVC तरीकों कि अपने डेटाबेस मॉडल मापदंडों लेते हैं और उन्हें काम करने और कार्य कर HTML/JSON या XML में अनुवाद पैदा करते हैं। अपने आंशिक और मास्टर विचारों में इन कस्टम HTML मददगारों का संदर्भ लें।

आप इस तरह से अपने HTMLHelpers लागू हैं, तो आप तर्क यह है कि डेटा तक और देखने योग्य HTML में संरचित डेटाबेस डेटा तब्दील हो के साथ अपने JIT संकलित कोड (सभी दृश्य कोड) दूर सार संक्षेप रहे हैं। उपर्युक्त उदाहरण में आप प्रस्तुत कर रहे हैं कि आप जेआईटी रनटाइम पर अपने विचारों के लिए अधिकांश तर्क संकलित करेंगे जो प्रदर्शन के संदर्भ में बहुत महंगा है। एमवीसी इस तरह से डिजाइन किया गया था ताकि आप उस ओवरहेड को लेने से रोक सकें। यदि आप शक्तिशाली एचटीएमएल हेल्पर्स बनाते हैं जो पूर्व-संकलित पुस्तकालयों में मौजूद हैं, तो आप अपना व्यू कोड बहुत छोटा और सरल बना सकते हैं।

संबंधित मुद्दे