2012-02-11 9 views
24

मैं साइट को बहुत खोज रहा हूं, लेकिन मुझे लगता है कि आंशिक नियंत्रण .ascx को प्रस्तुत करने के तरीके के बारे में उदाहरण थे, या नियंत्रक संदर्भ पर निर्भर थे।एएसपी.नेट एमवीसी 3 में एक स्ट्रिंग में रेजर व्यू कैसे प्रस्तुत करें?

string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model); 

सभी उदाहरण मैं थे मिल सकता है:

मैं एक विधि है कि मुझे देखने के लिए सिर्फ रिश्तेदार पथ, और एक मॉडल प्रदान करते हैं और एक स्ट्रिंग में उस मॉडल के साथ उस दृश्य प्रस्तुत करने के लिए सक्षम बनाता है चाहता हूँ या तो एमवीसी के पुराने संस्करणों के लिए, या बस ऐसा नहीं किया जो मुझे यहां करने की ज़रूरत है।

उत्तर

26

आप razorengine साथ कि प्राप्त कर सकते हैं।

string template = "Hello @Model.Name! Welcome to Razor!"; 
string result = Razor.Parse(template, new { Name = "World" }); 

और यह नियंत्रक संदर्भ पर निर्भर नहीं करता है - लेकिन उसकी वजह से आप एचटीएमएल सहायकों (जो http संदर्भ पर भरोसा करते हैं) का उपयोग करने में सक्षम नहीं हैं। लेकिन स्ट्रिंग के लिए टेम्पलेट इंजन के रूप में रेजर का उपयोग करना सही है।

+1

क्या यह काम करने का कोई तरीका है यदि मेरे पास एक cshtml फ़ाइल में लॉजर रेजर टेम्पलेट है? मुझे पार्टी के लिए थोड़ा देर हो गई है। –

+2

कोई चिंता नहीं - मैं अभी भी आसपास हूं :) और निश्चित रूप से, 'File.ReadAllText (पथ);' चर के माध्यम से सामग्री को लोड करें। – Marc

+0

क्या आप ऑब्जेक्ट (मॉडल) को देखने के लिए पास कर सकते हैं? @Marc – Kennyomar

12

आप इस लिंक को देख सकते हैं।

Render Razor view to String से निकाली गई सामग्री। ।

public static string RenderRazorViewToString(string viewName, object model) 
{ 
    ViewData.Model = model; 
    using (var sw = new StringWriter()) 
    { 
     var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
     viewResult.View.Render(viewContext, sw); 
     return sw.GetStringBuilder().ToString(); 
    } 
} 
+11

मुद्दा यह है कि उदाहरण के एक नियंत्रक संदर्भ है, जो मैं मैं कहाँ 'से की जरूरत नहीं है की आवश्यकता है मैं इस विधि को कॉल करने का प्रयास कर रहा हूँ। – bevacqua

10

मैंने अपने लिए समाधान बनाया था। यह एक्सटेंशन है जो स्ट्रिंग में दृश्य प्रस्तुत करता है।

public static class RenderPartialToStringExtensions 
{ 
    /// <summary> 
    /// render PartialView and return string 
    /// </summary> 
    /// <param name="context"></param> 
    /// <param name="partialViewName"></param> 
    /// <param name="model"></param> 
    /// <returns></returns> 
    public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model) 
    { 
     return RenderPartialToStringMethod(context, partialViewName, model); 
    } 

    /// <summary> 
    /// render PartialView and return string 
    /// </summary> 
    /// <param name="context"></param> 
    /// <param name="partialViewName"></param> 
    /// <param name="viewData"></param> 
    /// <param name="tempData"></param> 
    /// <returns></returns> 
    public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) 
    { 
     return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); 
    } 

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) 
    { 
     ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName); 

     if (result.View != null) 
     { 
      StringBuilder sb = new StringBuilder(); 
      using (StringWriter sw = new StringWriter(sb)) 
      { 
       using (HtmlTextWriter output = new HtmlTextWriter(sw)) 
       { 
        ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output); 
        result.View.Render(viewContext, output); 
       } 
      } 

      return sb.ToString(); 
     } 
     return String.Empty; 
    } 

    public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, object model) 
    { 
     ViewDataDictionary viewData = new ViewDataDictionary(model); 
     TempDataDictionary tempData = new TempDataDictionary(); 
     return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); 
    } 
} 

और की तुलना में हम कार्रवाई

[HttpPost] 
public ActionResult GetTreeUnit(string id) 
{ 
    int _id = id.ExtractID(); 
    string render = ControllerContext.RenderPartialToString("SomeView"); 
    return Json(new { data = render }); 
} 
3

में दृश्य प्रदान कर सकते हैं हालांकि मार्क का जवाब सही है और पिछले संस्करणों के लिए काम करता है। लेकिन अब यह अप्रचलित है और इसे बदलने की जरूरत है।

यहाँ नए कोड है कि मेरे लिए काम किया है और आप Github पर और अधिक उपयोगी जानकारी पा सकते हैं: Razor Engine

string template = "Hello @Model.Name! Welcome to Razor!"; 
string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" }); 
संबंधित मुद्दे