किसी को भी एक कार्रवाई के अंदर एक दृश्य के उत्पन्न HTML पाने के लिए पता है?
क्या यह कुछ इस तरह है:
public ActionResult Do()
{
var html = RenderView("hello", model);
...
}
जवाबों:
मैं एक कक्षा में एक स्थिर पद्धति का उपयोग करता हूं जिसे 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
।
this
कंट्रोलर के तर्क के रूप में पास करें । RenderPartialViewToString(this, "index", viewModel)
। मुझे लगता है कि यह मूर्खतापूर्ण है कि केवल दृश्य इंजन को लागू करने और वापस स्ट्रिंग प्राप्त करने का कोई आसान तरीका नहीं है, लेकिन ASP.NET में दृश्य इंजन को दृश्य संकलन करने के लिए नियंत्रक उदाहरण के संदर्भ की आवश्यकता है। मैं अब एक नोडज डेवलपर हूं और नोड में व्यू इंजन पूरे अलग-अलग मॉड्यूल हैं जिन्हें आप मैन्युअल रूप से या एमवीसी ढांचे के साथ व्यक्त कर सकते हैं ।
ऊपर @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
, और फिर RenderViewResultAsString
HTML HTML प्राप्त करने के लिए कॉल कर सकता हूं :
var viewResult = this.Foo(model, bar);
var html = this.RenderViewResultAsString(viewResult);
masterName
) की आवश्यकता होती है, जिसे आप शून्य निर्दिष्ट करेंगे। इसके अलावा, मैं सहेजने और बहाल करने की सलाह देता हूं (रेंडर करने के बाद) कंट्रोलर। व्यूडाटोड। मामले में वर्तमान कंट्रोलर इंस्टेंस पर विधि को कॉल किया जाता है और इस कॉल से पहले मॉडल को सौंपा गया है।