मुझे यकीन है कि ऐसा करने के कई तरीके हैं। मैं मैन्युअल रूप से नियंत्रक से दृश्य प्रस्तुत करता हूं, और उसके बाद मेरे JSON प्रतिक्रिया के हिस्से के रूप में प्रस्तुत दृश्य को वापस भेजता हूं।
यह प्रत्येक इकाई की जिम्मेदारियों को संरक्षित करता है। दृश्य अभी भी व्यू इंजन का उपयोग कर स्थित हैं और उनका पुन: उपयोग किया जा सकता है। नियंत्रक अपने नाम और मॉडल प्रकार से परे दृश्य के बारे में बहुत कम या कुछ नहीं जानता है।
मैनुअल प्रतिपादन
public static class RenderHelper
{
public static string PartialView(Controller controller, string viewName, object model)
{
controller.ViewData.Model = model;
using(var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);
return sw.ToString();
}
}
}
अपनी कार्रवाई विधि में:
object model = null; // whatever you want
var obj = new {
someOtherProperty = "hello",
view = RenderHelper.PartialView(this, "_PartialName", model)
};
return Json(obj);
ध्यान दें कि मैं एक गुमनाम प्रकार लौट रहा हूँ। जब तक आपके पास प्रस्तुत दृश्य के लिए स्ट्रिंग प्रॉपर्टी हो, तब तक आप किसी भी (serializable) प्रकार को वापस कर सकते हैं।
परीक्षण
एक कार्रवाई पुस्तिका प्रतिपादन का उपयोग करता है परीक्षण एक मामूली संशोधन की आवश्यकता है। यह एमवीसी पाइपलाइन में प्रस्तुत किए जाने से थोड़ा पहले दृश्य को प्रस्तुत करने के कारण है।
मैनुअल प्रतिपादन
- कार्रवाई विधि दर्ज
- प्रस्तुत दृश्य स्पष्ट रूप से < - यह यह मुश्किल बुला कार्रवाई
- से बाहर निकलें कार्रवाई विधि
स्वत: परीक्षण करने के लिए कर देगा
प्रस्तुत करना
- कार्रवाई विधि
- दर्ज की दृष्टि परिणाम
- से बाहर निकलें कार्रवाई विधि
- प्रक्रिया परिणाम देखें बनाएं (इस प्रकार दृश्य प्रतिपादन)
दूसरे शब्दों में, हमारे मैनुअल प्रतिपादन प्रक्रिया की शुरूआत की एक अन्य परिचालनों की विविधता जो परीक्षण करना मुश्किल बनाती हैं (जैसे दृश्य संकलन के लिए बिल्ड प्रबंधक के साथ बातचीत करना)।
मान लें कि आप कार्रवाई विधि का परीक्षण करना चाहते हैं, न कि दृश्य की वास्तविक सामग्री, आप जांच सकते हैं कि कोड होस्ट किए गए वातावरण में निष्पादित हो रहा है या नहीं।
public static string PartialView(Controller controller, string viewName, object model)
{
// returns false from a VS 2013 unit test, true from IIS
if(!HostingEnvironment.IsHosted)
{
// return whatever you want here
return string.Empty;
}
// continue as usual
}
जाँच हो रही है HostingEnvironment.IsHosted
सस्ती है (हुड के नीचे, यह बस एक अशक्त जांच है)। विकल्प के लिए
+1 कभी एक सहायक वर्ग के बारे में सोचा नहीं। यह सबसे सुरुचिपूर्ण समाधान हो सकता है। मै उसे करने की एक कोशिश तो करूंगा। धन्यवाद। – nthpixel
आप नहीं करना चाहते हैं: 'var obj = new {view = RenderHelper.PartialView (यह," _PartialName ", viewModel), model = koViewModel};'? या यह है कि 'foo' क्या है? या क्या मैं कुछ न कुछ भूल रहा हूं? – nwayve
@ डेनिस - हाँ, "foo" किसी भी अन्य डेटा का प्रतिनिधित्व करता है जिसे आपको वापस करने की आवश्यकता है। मुझे यकीन नहीं है कि क्लाइंट पर नॉकआउट की क्या ज़रूरत है, लेकिन दृश्य को एक मॉडल की भी आवश्यकता है (भले ही यह शून्य हो)। –