2008-09-07 19 views
8

यहां एक परिदृश्य है: मान लीजिए कि मेरे पास दो नियंत्रकों के साथ साइट है जो विभिन्न प्रकार की सामग्री प्रदर्शित करने के लिए ज़िम्मेदार है - पेज और लेख। मुझे अपने मास्टरपेज में आंशिक दृश्य एम्बेड करना होगा जो कुछ मानदंडों के साथ फ़िल्टर किए गए पृष्ठों और लेखों को सूचीबद्ध करेगा, और प्रत्येक पृष्ठ पर प्रदर्शित होगा। मैं अपने मास्टर पेज पर मॉडल सेट नहीं कर सकता (क्या मैं सही हूँ?)। मैं Html.RenderPartial का उपयोग करके इस कार्य को कैसे हल करूं?एचटीएमएल। मास्टरपेज से रेंडरपार्टियल कॉल

[संपादित करें] हां, शायद मैं लेख और पृष्ठों को सूचीबद्ध करने के लिए अलग आंशिक विचार तैयार करूंगा, लेकिन फिर भी, एक बाधा है कि मैं मास्टरपेज पर मॉडल सेट नहीं कर सकता और नहीं। मुझे किसी भी तरह से "यहां पेज हैं" कहने की ज़रूरत है, जो मेरे प्रस्तुतिकरण के लिए तर्क है, और लेखों के लिए भी। मास्टरपेज में डेटाबेस से डेटा के साथ renderpartial की पूरी अवधारणा मेरे लिए थोड़ा धुंधला है।

उत्तर

0

व्यूडाटा मॉडल प्रॉपर्टी का उपयोग केवल उस सामग्री के लिए किया जाना चाहिए जिसे आप यूआई के मुख्य भाग पर देख रहे/संपादित कर रहे हैं।

दृश्य के अन्य हिस्सों को व्यूडाटा में मौजूद कुछ डेटा की आवश्यकता हो सकती है, इसलिए बस उन्हें शब्दकोश में जोड़ें।

मैं इस तरह के शब्दकोश से डेटा पास कर दूंगा: व्यूडाटा ["लेख"] आंशिक रूप से। (या MvcContrib से ViewData.Get())।

आप हाल ही में लागू किए गए सबकंट्रोलर पैटर्न को भी देख सकते हैं MvcContrib में लागू किया गया।

0

हाँ, यह सही है। लेकिन आइए इस परिदृश्य को देखें: लेखों से संबंधित विचारों पर, मेरे पास व्यूडाटा ["आलेख"] होगा, और पृष्ठों से संबंधित विचारों पर, मेरे पास व्यूडाटा ["पेज"] है, लेकिन मेरे पास दोनों नहीं हैं लेख और पेज हर समय उपलब्ध हैं। तो, अगर मैं जोड़ें:

Html.RenderPartial ("articlesView", ViewData [ "लेख"])

Html.RenderPartial ("pagesView", ViewData [ "पृष्ठों"])

को

मेरी मास्टरपेज, मेरे पास प्रत्येक पृष्ठ पर एक अपवाद डाला जाएगा जिस पर ViewDataDictionary में लेख और पृष्ठ दोनों शामिल नहीं हैं।

कम से कम, मैं इसे देखता हूं।

1

मेरे पास similar post था और इसे संभालने के लिए ऑब्जेक्ट मॉडल के साथ आया था।

मैं दृढ़ता से टाइप किए गए विचारों से नफरत करता हूं इसलिए इस दृष्टिकोण के साथ चला गया और यह अच्छी तरह से काम कर रहा है।

2

एक HTMLHelper एक्सटेंशन विधि बनाने के बारे में जो आपको नियंत्रक पर एक क्रिया पर आंशिक दृश्य परिणाम कॉल करने की अनुमति देता है।

कुछ

तरह
public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender) 
    where TController : Controller, new() 
{ 
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext}; 
    actionToRender(arg).ExecuteResult(arg.ControllerContext); 
} 

आप तो

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %> 

की तरह है और अपने नियंत्रक में उचित विधि

public PartialViewResult RenderPartial() 
{ 

    return PartialView("~/Path/or/View",_homeService.GetModel()) 
} 

खैर मेरी 2 सेंट है कि आपके मास्टर पृष्ठ में इस इस्तेमाल कर सकते हैं वैसे भी

0

जिस तरह से मैं इसे संभालने का तरीका बेसव्यूमोडेल का उपयोग कर रहा हूं। सभी दृश्य दृढ़ता से एक दृश्य मॉडल के खिलाफ टाइप किए जाते हैं जो BaseViewModel से प्राप्त होता है।

बेसव्यू मॉडेल क्लास में मास्टरपेज द्वारा आवश्यक सभी जानकारी है। तो नेविगेशन के लिए अपने BaseViewModel कुछ ऐसा दिखाई देगा:

public class BaseViewModel 
{ 
    public BaseViewModel() 
    { 
     NavigationItems = RetrieveNavigationItemsFromModel(); 
    } 
    public List<NavItems> NavigationItems {get; set;} 
} 

अपने masterpage में और PartialViews, आप BaseViewModel को मॉडल डाली और NavigationsItems संपत्ति पहुँच सकते हैं।

<ul> 
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %> 
    <li> 
     <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a> 
    </li> 
<% } %> 
</ul> 
0

यह एक बहुत ही देर जबाब है , लेकिन मुझे गुगलिंग के दौरान इस पृष्ठ पर पहुंचा - तो संभावना है कि कोई और इस प्रश्न को देखेगा (और मेरा जवाब)।

जिस तरह से मैंने इस समस्या के आसपास काम किया है वह एक पार्टिकल व्यू लोड करने और उसके नियंत्रक कोड को निष्पादित करने के लिए एक साधारण jQuery स्क्रिप्ट का उपयोग कर रहा है। नीचे नमूना

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 

    <script type="text/javascript"> 
      $(document).ready(function() { 
      $("#applicationForm").load("/Home/ApplicationForm"); 
      }); 
    </script> 

    <div id="applicationForm" /> 

</asp:Content> 

इस दृष्टिकोण के लिए बड़ा दोष यह ग्राहक यह काम करने के लिए पटकथा सक्षम होना पड़ता है (इसलिए यह वास्तव में एसईओ अमित्र है)। यदि ऐसा कुछ है जिसके साथ आप रह सकते हैं तो यह अच्छी तरह से काम करता है। मैं केवल इसे इंट्रानेट साइट पर उपयोग करता हूं जहां मुझे पता है कि प्रत्येक क्लाइंट में जावास्क्रिप्ट सक्षम है और मुझे Google के बॉट्स के बारे में चिंता करने की ज़रूरत नहीं है।

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