2013-09-06 11 views
13

से रिटर्न आंशिक दृश्य और जेएसओएन मैं एक मौजूदा ऐप में नॉकआउटजेएस पेश कर रहा हूं। मेरी योजना मौजूदा आंशिक विचारों को संशोधित/उपयोग करना है जिसे हमने पहले ही बनाया है और उन्हें नॉकआउट के घोषणात्मक विशेषताओं के साथ जेएस व्यू मॉडलों में बाध्य करना है। जब मैं एक एजेक्स कॉल को किसी क्रिया के लिए करता हूं, आदर्श रूप में मैं आंशिक दृश्य और JSON ऑब्जेक्ट के HTML को वापस करने की कार्रवाई करना चाहता हूं। फिर मैं एचटीएमएल के साथ एक div भर सकता हूं, जेएसओएन को नॉकआउट ऑब्जेक्ट में बदल सकता हूं और इसे HTML पर बांध सकता हूं। लेकिन मैं यह नहीं समझ सकता कि कार्रवाई से दोनों को कैसे वापस किया जाए।एएसपी.नेट एमवीसी एक्शन

मुझे पूर्ण दृश्य मॉडल की आवश्यकता है क्योंकि मैं इसे अपडेट कर रहा हूं और अंततः इसे सर्वर पर भेज रहा हूं।

मैंने सोचा कि आंशिक दृश्य (मॉडल से पहले से ही बाध्य) वापस आ गया है, और आंशिक दृश्य में, नेट मॉडल को नॉकआउट ऑब्जेक्ट में कनवर्ट करने के लिए जावास्क्रिप्ट शामिल करें। लेकिन मुझे लगता है कि जेएस को इस तरह के आसपास बिखरा हुआ गन्दा और अस्पष्ट है। मैं मूल AJAX कॉल के करीब सब कुछ होगा।

मुझे लगता है कि एक और विकल्प दो एक्शन कॉल करना है। JSON के लिए एक, और आंशिक दृश्य के लिए दूसरा। लेकिन एक slicker रास्ता होना चाहिए।

इस पर कोई विचार है कि यह कैसे करना है?

उत्तर

21

मुझे यकीन है कि ऐसा करने के कई तरीके हैं। मैं मैन्युअल रूप से नियंत्रक से दृश्य प्रस्तुत करता हूं, और उसके बाद मेरे 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) प्रकार को वापस कर सकते हैं।

परीक्षण

एक कार्रवाई पुस्तिका प्रतिपादन का उपयोग करता है परीक्षण एक मामूली संशोधन की आवश्यकता है। यह एमवीसी पाइपलाइन में प्रस्तुत किए जाने से थोड़ा पहले दृश्य को प्रस्तुत करने के कारण है।

मैनुअल प्रतिपादन

  1. कार्रवाई विधि दर्ज
  2. प्रस्तुत दृश्य स्पष्ट रूप से < - यह यह मुश्किल बुला कार्रवाई
  3. से बाहर निकलें कार्रवाई विधि

स्वत: परीक्षण करने के लिए कर देगा

प्रस्तुत करना
  1. कार्रवाई विधि
  2. दर्ज की दृष्टि परिणाम
  3. से बाहर निकलें कार्रवाई विधि
  4. प्रक्रिया परिणाम देखें बनाएं (इस प्रकार दृश्य प्रतिपादन)

दूसरे शब्दों में, हमारे मैनुअल प्रतिपादन प्रक्रिया की शुरूआत की एक अन्य परिचालनों की विविधता जो परीक्षण करना मुश्किल बनाती हैं (जैसे दृश्य संकलन के लिए बिल्ड प्रबंधक के साथ बातचीत करना)।

मान लें कि आप कार्रवाई विधि का परीक्षण करना चाहते हैं, न कि दृश्य की वास्तविक सामग्री, आप जांच सकते हैं कि कोड होस्ट किए गए वातावरण में निष्पादित हो रहा है या नहीं।

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 सस्ती है (हुड के नीचे, यह बस एक अशक्त जांच है)। विकल्प के लिए

+0

+1 कभी एक सहायक वर्ग के बारे में सोचा नहीं। यह सबसे सुरुचिपूर्ण समाधान हो सकता है। मै उसे करने की एक कोशिश तो करूंगा। धन्यवाद। – nthpixel

+0

आप नहीं करना चाहते हैं: 'var obj = new {view = RenderHelper.PartialView (यह," _PartialName ", viewModel), model = koViewModel};'? या यह है कि 'foo' क्या है? या क्या मैं कुछ न कुछ भूल रहा हूं? – nwayve

+0

@ डेनिस - हाँ, "foo" किसी भी अन्य डेटा का प्रतिनिधित्व करता है जिसे आपको वापस करने की आवश्यकता है। मुझे यकीन नहीं है कि क्लाइंट पर नॉकआउट की क्या ज़रूरत है, लेकिन दृश्य को एक मॉडल की भी आवश्यकता है (भले ही यह शून्य हो)। –

1

आप व्यूमोडेल के JSON स्ट्रिंग के मान सेट के साथ आंशिक पर एक छिपा <input> बना सकते हैं। फिर आंशिक दृश्य प्रस्तुत करने से पहले, उस फ़ील्ड से JSON मान को पकड़ें, और इसे पार्स करें। फिर, आंशिक दृश्य से निकालने के अपने पृष्ठ में डालें, और ko.applyBindingsToDescendants(viewModel, $("#parentElement")[0])

कर मैं पूरी तरह यकीन है कि कैसे मैं इस दृष्टिकोण के बारे में नहीं लग रहा हूँ, और यह सिर्फ एक सिद्धांत है। मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे संदेह है कि यह काम करेगा। एक booty trap आपको अपने जीईटी अनुरोध को कैश करने का प्रयास करने वाला ब्राउजर देखना होगा। अपने ajax अनुरोध में आप क्या करना चाहते हैं:

$.ajax({ 
    url: "/", 
    type: 'GET', 
    cache: 'false' 
}); 

या सिर्फ एक $.post अनुरोध करते हैं। (reference)

तो यह एक विकल्प है।

+0

+1 ... लेकिन मुझे यकीन नहीं है कि मैं इसके बारे में कैसा महसूस करता हूं। – nthpixel

संबंधित मुद्दे