ASP.NET MVC रेजर: कंट्रोलर एक्शन के अंदर रेजर आंशिक दृश्य के HTML को कैसे रेंडर किया जाए


97

ASP.NET व्यू इंजन पर दिए गए आंशिक दृश्य के HTML को कैसे जेनरेट किया जाता है

लेकिन अगर इस कार्यक्षमता का उपयोग रेजर आंशिक दृश्य पर किया जाता है तो यह काम नहीं करता है, जैसा कि अपवाद कहता है कि आंशिक दृश्य "UserControl" से प्राप्त नहीं होता है।

रेजर आंशिक दृश्य का समर्थन करने के लिए रेंडरिंग को कैसे ठीक करें?

मुझे इसकी आवश्यकता है क्योंकि मैं इस आंशिक विचार को ईमेल बनाता हूं ...

अपडेट करें:

कोड जो विफल रहता है (@ mcl):

public string RenderPartialToString(string controlName, object viewData)
    {
        ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
        viewPage.Url = this.GetUrlHelper();

        string fullControlName = "~/Views/Email/" + controlName + ".ascx";

        viewPage.ViewData = new ViewDataDictionary(viewData);
        viewPage.Controls.Add(viewPage.LoadControl(fullControlName));

        StringBuilder sb = new StringBuilder();
        using (StringWriter sw = new StringWriter(sb))
        {
            using (HtmlTextWriter tw = new HtmlTextWriter(sw))
            {
                viewPage.RenderControl(tw);
            }
        }
        return sb.ToString();
    }

1
क्या आप अब तक का कोड दिखा सकते हैं जो अपवाद उत्पन्न करता है?
मलाईबाई

जवाबों:


154
@Html.Partial("nameOfPartial", Model)

अपडेट करें

protected string RenderPartialViewToString(string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

    ViewData.Model = model;

    using (StringWriter sw = new StringWriter()) {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}

हाँ, यह है कि आप एक दृश्य के अंदर एक आंशिक दृश्य कैसे प्रस्तुत करते हैं। लेकिन इसे एक कंट्रोलर एक्शन के अंदर कैसे रेंडर किया जाए?
पीटर स्टेग्नार

महान अब यह है! Razon और ASP संकेतन के साथ काम करता है।
18 स्टेन पर पीटर स्टैगनर

2
एक सबक्वेस्टियोन: उस दृश्य को कैसे रेंडर किया जाए जो किसी दूसरे कंट्रोलर के दायरे में है तो करंट में? यह कहते हैं कि यह "EmailController" गुंजाइश (ईमेल दृश्य फ़ोल्डर) में है?
पीटर स्टेग्नार

1
यह एक महान समाधान था। मुझे ईमेल की सटीक आवश्यकता थी और इसे इस्तेमाल करने का विकल्प चुना।
११:५१ तक उराद्र्व

2
@AmeyKhadatkar: नहीं। jquery क्लाइंट साइड है, ब्राउज़र पर भेजे जाने से पहले सर्वर साइड पर व्यू उत्पन्न होता है।
jgauffin

8

हालाँकि पहले से ही पर्याप्त उत्तर दिए जा चुके हैं, मैं एक कम क्रिया समाधान का प्रस्ताव देना चाहता हूँ, जिसका उपयोग MVC नियंत्रक वर्ग में उपलब्ध सहायक विधियों के बिना किया जा सकता है। "RazorEngine" नामक एक तीसरे पक्ष के पुस्तकालय का उपयोग करके आप रेजर फ़ाइल और कॉल की सामग्री प्राप्त करने के लिए .Net फ़ाइल IO का उपयोग कर सकते हैं

string html = Razor.Parse(razorViewContentString, modelObject);

यहां थर्ड पार्टी लाइब्रेरी लें ।


5

आप यहांRenderView Controller extension से भी इस्तेमाल कर सकते हैं ( स्रोत )

और इसे इस तरह उपयोग करें:

public ActionResult Do() {
var html = this.RenderView("index", theModel);
...
}

यह रेज़र और वेब-फॉर्म व्यूएन्जिन के लिए काम करता है


लिंक की जाँच की। @ChurkNorris ASP.net MVC Awesome का लेखक है , जो कि संस्करण 2.0 (वर्तमान में नवीनतम रिलीज़ मार्च 2012) से एक व्यावसायिक उत्पाद हैसंस्करण 1.9 (नवीनतम रिलीज़ जून 9 2011) अभी भी खुला स्रोत है, लेकिन शायद इसे और अधिक विकसित नहीं किया जाएगा। 1.9 के किसी भी कांटे वहाँ?
जोएल पूर्व

@Omu: RenderView शून्य है। देखें msdn.microsoft.com/en-us/library/...
रोलाण्ड

@Roland इस एक कस्टम नियंत्रक विस्तार है
Omu

1

मैंने देखा कि कोई सोच रहा था कि इसे किसी अन्य नियंत्रक के लिए कैसे किया जाए।

मेरे मामले में मेरे पास व्यू / ईमेल फ़ोल्डर में मेरे सभी ईमेल टेम्प्लेट थे, लेकिन आप इसे उस नियंत्रक में पास करने के लिए संशोधित कर सकते हैं जिसमें आपके पास संबंधित विचार हैं।

public static string RenderViewToString(Controller controller, string viewName, object model)
    {
        var oldController = controller.RouteData.Values["controller"].ToString();

        if (controller.GetType() != typeof(EmailController))
            controller.RouteData.Values["controller"] = "Email";

        var oldModel = controller.ViewData.Model;
        controller.ViewData.Model = model;
        try
        {
            using (var sw = new StringWriter())
            {
                var viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName,
                                                                           null);

                var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);

                //Cleanup
                controller.ViewData.Model = oldModel;
                controller.RouteData.Values["controller"] = oldController;

                return sw.GetStringBuilder().ToString();
            }
        }
        catch (Exception ex)
        {
            Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

            throw ex;
        }
    }

अनिवार्य रूप से यह क्या करता है एक नियंत्रक, जैसे कि खाता नियंत्रक और यह संशोधित करने के लिए सोचने के लिए कि यह एक ईमेल नियंत्रक है ताकि कोड Views/Emailफ़ोल्डर में दिखेगा । ऐसा करना आवश्यक है क्योंकि FindViewविधि एक पैरामीटर के रूप में सीधे ऊपर का रास्ता नहीं लेती है, यह एक चाहता है ControllerContext

एक बार स्ट्रिंग को रेंडर करने के बाद, यह रिस्पांस ऑब्जेक्ट द्वारा उपयोग किए जाने के लिए अकाउंटकंट्रोलर को उसकी प्रारंभिक स्थिति में वापस कर देता है।


1

महान कोड; थोड़ा संकेत: यदि आपको कभी-कभी अधिक डेटा को बायपास करना है और न केवल दृश्यमॉडल ।।

 if (model is ViewDataDictionary)
 {
     controller.ViewData = model as ViewDataDictionary;
 } else {
     controller.ViewData.Model = model;
 }

2
आपने अपना उत्तर पूरा नहीं किया है
पूह

0

HtmlHelper एक्सटेंशन के रूप में @jgauffin उत्तर उधार लेना:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString RenderPartialViewToString(
        this HtmlHelper html, 
        ControllerContext controllerContext, 
        ViewDataDictionary viewData,
        TempDataDictionary tempData,
        string viewName, 
        object model)
    {
        viewData.Model = model;
        string result = String.Empty;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
            ViewContext viewContext = new ViewContext(controllerContext, viewResult.View, viewData, tempData, sw);
            viewResult.View.Render(viewContext, sw);

            result = sw.GetStringBuilder().ToString();
        }

        return MvcHtmlString.Create(result);
    }
}

एक उस्तरा दृश्य में उपयोग:

Html.RenderPartialViewToString(ViewContext, ViewData, TempData, "Search", Model)

1
क्या आप @ Html.Partial (स्ट्रिंग आंशिक दृश्य नाम, ऑब्जेक्ट मॉडल, ViewDataDictionary viewData) का उपयोग करके अंतर की व्याख्या कर सकते हैं? HtmlHelper की आवश्यकता के बाद से क्या लाभ हैं?
bkqc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.