MVC3 रेज़र में, मुझे किसी कार्रवाई के अंदर प्रदान किए गए दृश्य का HTML कैसे मिलता है?


90

किसी को भी एक कार्रवाई के अंदर एक दृश्य के उत्पन्न HTML पाने के लिए पता है?

क्या यह कुछ इस तरह है:

public ActionResult Do()
{
    var html = RenderView("hello", model);
...
}

जवाबों:


152

मैं एक कक्षा में एक स्थिर पद्धति का उपयोग करता हूं जिसे Utilities.Commonमैंने क्लाइंट के पास JSON ऑब्जेक्ट के गुणों के रूप में वापस देखने के लिए बुलाया था, इसलिए मुझे उन्हें एक स्ट्रिंग में प्रस्तुत करने की आवश्यकता थी। ये रहा:

public static string RenderPartialViewToString(Controller controller, string viewName, object model)
{
    controller.ViewData.Model = model;
    using (StringWriter sw = new StringWriter())
    {
        ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
        ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
        viewResult.View.Render(viewContext, sw);

        return sw.ToString();
    }
}

यह पूर्ण विचारों के साथ-साथ आंशिक विचारों के लिए भी काम करेगा, बस इसमें बदलाव ViewEngines.Engines.FindPartialViewहोगा ViewEngines.Engines.FindView


14
फाइंडव्यू को एक और पैरामीटर ( masterName) की आवश्यकता होती है, जिसे आप शून्य निर्दिष्ट करेंगे। इसके अलावा, मैं सहेजने और बहाल करने की सलाह देता हूं (रेंडर करने के बाद) कंट्रोलर। व्यूडाटोड। मामले में वर्तमान कंट्रोलर इंस्टेंस पर विधि को कॉल किया जाता है और इस कॉल से पहले मॉडल को सौंपा गया है।
आंद्रेई रोनेया

4
आपको viewResult.ViewEngine.ReleaseView (कंट्रोलर.कंट्रोलरकोटेक्स्ट, viewResult.View) को भी कॉल करना चाहिए
sjmeverett

3
यह बहुत अच्छा काम करता है, लेकिन मैं अपने लाइव कोड में अपवादों को पकड़ना और सौंपना नहीं चाहता।
पौलोया

3
यदि आप इसे कंट्रोलर के भीतर से ही कॉल कर रहे हैं तो thisकंट्रोलर के तर्क के रूप में पास करें । RenderPartialViewToString(this, "index", viewModel)। मुझे लगता है कि यह मूर्खतापूर्ण है कि केवल दृश्य इंजन को लागू करने और वापस स्ट्रिंग प्राप्त करने का कोई आसान तरीका नहीं है, लेकिन ASP.NET में दृश्य इंजन को दृश्य संकलन करने के लिए नियंत्रक उदाहरण के संदर्भ की आवश्यकता है। मैं अब एक नोडज डेवलपर हूं और नोड में व्यू इंजन पूरे अलग-अलग मॉड्यूल हैं जिन्हें आप मैन्युअल रूप से या एमवीसी ढांचे के साथ व्यक्त कर सकते हैं
Chev

5
@PauloManuelSantos मैं आपसे सहमत हूं। मैंने यह वर्षों पहले लिखा था और मुझे नहीं पता कि मैं उत्तर में त्रुटि से निपटने के लिए क्या सोच रहा था। मैंने कोशिश / कैच को बाहर करने के लिए उत्तर को अपडेट कर दिया है। प्रतिक्रिया के लिए धन्यवाद।
चेव

4

ऊपर @Chev द्वारा स्वीकृत उत्तर अच्छा है, लेकिन मैं केवल एक विशेष दृश्य नहीं, बल्कि एक विशिष्ट कार्रवाई के परिणाम को प्रस्तुत करना चाहता था ।

इसके अलावा, मुझे एक मॉडल को इंजेक्ट करने पर भरोसा करने के बजाय उस कार्रवाई में मापदंडों को पारित करने में सक्षम होने की आवश्यकता है।

इसलिए मैं अपनी विधि के साथ आया, जिसे मैंने अपने नियंत्रकों के आधार वर्ग में रखा (उन्हें यह सब उपलब्ध कराया गया):

    protected string RenderViewResultAsString(ViewResult viewResult)
    {
        using (var stringWriter = new StringWriter())
        {
            this.RenderViewResult(viewResult, stringWriter);

            return stringWriter.ToString();
        }
    }

    protected void RenderViewResult(ViewResult viewResult, TextWriter textWriter)
    {
        var viewEngineResult = this.ViewEngineCollection.FindView(
            this.ControllerContext, 
            viewResult.ViewName, 
            viewResult.MasterName);
        var view = viewEngineResult.View;

        try
        {
            var viewContext = new ViewContext(
                this.ControllerContext, 
                view, 
                this.ViewData, 
                this.TempData, 
                textWriter);

            view.Render(viewContext, textWriter);
        }
        finally
        {
            viewEngineResult.ViewEngine.ReleaseView(this.ControllerContext, view);
        }
    }

मान लीजिए कि मेरे पास एक एक्शन है Fooजो एक मॉडल ऑब्जेक्ट और कुछ अन्य मापदंडों को लेता है, जो एक साथ प्रभावित करते हैं कि किस दृश्य का उपयोग किया जाएगा:

    public ViewResult Foo(MyModel model, int bar)
    {
        if (bar == 1)
            return this.View("Bar1");
        else
            return this.View("Bar2", model);
    }

अब, यदि मैं कॉलिंग एक्शन का परिणाम प्राप्त करना चाहता हूं, तो मैं Fooबस विधि ViewResultको लागू करके प्राप्त कर सकता हूं Foo, और फिर RenderViewResultAsStringHTML HTML प्राप्त करने के लिए कॉल कर सकता हूं :

    var viewResult = this.Foo(model, bar);

    var html = this.RenderViewResultAsString(viewResult);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.