2012-07-12 11 views
10

में एएसपी.नेट एमवीसी 3 आंशिक दृश्य मैं एएसपीनेट एमवीसी लेआउट पेज के लिए एक साझा सामग्री (नेविगेशन) स्थापित करने पर काम कर रहा हूं।लेआउट पेज

यहां मॉडल से नेविगेशन डेटा खींचने के लिए कोड के साथ मेरा आंशिक दृश्य "_LayoutPartial.cshtml" है।

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     //Test dump of navigation data 
     @Html.Encode(item.Name); 
     @Html.Encode(item.URL); 

    } 
</p> 

यहां मेरे नियंत्रक "LayoutController.cs" के लिए कोड कैसा दिखता है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyApp.Models.ViewModel; 

namespace MyApp.Controllers 
{ 
    public class LayoutController : Controller 
    { 

     // 
     // GET: /Layout/ 

     LayoutViewModel layout = new LayoutViewModel(); 

     public ActionResult Index() 
     { 
      return View(layout); 
     } 

    } 
} 

"_Layout.cshtml" पृष्ठ के लिए कोड यहां दिया गया है। मैं यहां HTML.RenderAction (एक्शन, कंट्रोलर) विधि का उपयोग करके आंशिक दृश्य को कॉल करने का प्रयास कर रहा हूं।

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <p> 
     @{Html.RenderAction("Index","Layout");} 
    </p> 

    @RenderBody() 
</body> 
</html> 

लेआउट पेज कार्यान्वित जब @ {Html.RenderAction ("सूचकांक", "लेआउट");} लाइन, यह बाहर फेंक एक त्रुटि संदेश "त्रुटि हैंडलर के लिए बच्चे को अनुरोध निष्पादित 'System.Web.Mvc .HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper '। "

मुझे दोस्तों को क्या याद आ रही है? मैं लेआउट पेज में आंशिक दृश्य कैसे कॉल कर सकता हूं?

सभी को अग्रिम धन्यवाद!

+0

अपने आंशिक दृश्य कहां स्थित है –

+0

~/दृश्य/साझा/_LayoutPartial.cshtml – Felasfaw

उत्तर

16
बजाय

:

public ActionResult Index() 
{ 
    return View(layout); 
} 

कार्य करें:

public ActionResult Index() 
{ 
    return PartialView(layout); 
} 

आप ऐसा नहीं करते हैं कि जब आप अपने बच्चे को कार्रवाई से एक सामान्य दृश्य लौटने के लिए, यह सामान्य दृश्य लेआउट शामिल करने के लिए प्रयास करता है, जो बदले में बच्चे की कार्रवाई को प्रस्तुत करने का प्रयास करता है, जो बदले में एक दृश्य देता है, जिसमें बदले में लेआउट शामिल होता है, जो बदले में बच्चे की कार्रवाई को प्रस्तुत करने का प्रयास करता है ... और हम इसके द्वारा पोर्ट किए गए नामों के साथ समाप्त होते हैं एक ही साइट।

इसके अलावा आपके आंशिक रूप में आपको डबल एन्कोडिंग करने की आवश्यकता नहीं है।

@model MyApp.Models.ViewModel.LayoutViewModel 
<p> 

    @foreach (var item in Model.navHeader) 
    { 
     @item.Name 
     @item.URL 
    } 
</p> 
+1

फेंकता "ऑब्जेक्ट संदर्भ एक वस्तु का एक उदाहरण के लिए सेट नहीं।" आंशिक दृश्य फ़ाइल में @foreach लाइन पर। ऐसा लगता है जैसे navHeader ऑब्जेक्ट कोई आइटम नहीं आ रहा है। – Felasfaw

+1

आप '@ {HTML.RenderAction (" अनुक्रमणिका "," लेआउट ") के बजाय '@ HTML.Action (" अनुक्रमणिका, "लेआउट") लिख सकते हैं;}' हालांकि मुझे नहीं पता कि कौन सा तेज़ है। –

6

पहले सत्यापित करें कि आपके बच्चे को देखने Shared निर्देशिका

@Html.Partial("_LayoutPartial") 

या

@{Html.RenderAction("actionname", "controller name");} 

के अंदर है और @Html.Encode(), रेजर का उपयोग नहीं करते: @ उस्तरा समारोह पहले से ही एचटीएमएल एनकोड करता है पहले से ही आपके लिए कर रहा है बस लेआउट पेज

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper 

महत्वपूर्ण पर हो रही

@item.Name 
@item.URL 
+0

पहला एचटीएमएल। पार्टियल फेंकता है "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के इंस्टेंस पर सेट नहीं है" त्रुटि। दूसरा सुझाव मेरे पहले पोस्ट में पोस्ट किए गए त्रुटि संदेश को फेंकता है। – Felasfaw

+0

आपका आंशिक दृश्य कहां स्थित है, मेरा मतलब है कि यह अंदर होना चाहिए साझा निर्देशिका? –

+0

हां आंशिक दृश्य साझा निर्देशिका के अंदर स्थित है। – Felasfaw

2

मैं इस त्रुटि को हल किया है का उपयोग करें! पहले, साझा फ़ोल्डर

नियंत्रक में अंदर आंशिक दृश्य बनाने

public PartialViewResult Userdetails() 
{ 
    .... 
    return PartialView("PartialViewName", obj); 
} 

लेआउट पृष्ठ में,

@{Html.RenderAction("action","controller");} 
+0

बहुत बढ़िया !!! यह मेरे लिए काम करता है ! महान!! –

0

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैंने सोचा कि मैं यहाँ में इस फेंक होगा। आप या तो Html.Action या Html.RenderAction का उपयोग कर सकते हैं। वे दोनों तकनीकी रूप से एक ही काम करते हैं लेकिन इस बात पर निर्भर करते हैं कि आप कितनी सामग्री वापस लौट रहे हैं इसका असर हो सकता है जिस पर आपको वास्तव में सर्वोत्तम दक्षता के लिए उपयोग करना चाहिए।

दोनों विधियां आपको दृश्य से एक क्रिया विधि में कॉल करने और दृश्य के भीतर कार्रवाई के परिणामों को आउटपुट करने की अनुमति देती हैं। दोनों के बीच का अंतर यह है कि Html.RenderAction सीधे परिणाम को परिणाम प्रदान करेगा (यदि कार्रवाई बड़ी मात्रा में एचटीएमएल लौटाती है तो अधिक कुशल है) जबकि Html.Action परिणाम के साथ एक स्ट्रिंग देता है।

Source

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