2008-11-29 13 views
9

मैं एएसपीनेट एमवीसी में usercontrols का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं। मुझे पता है कि एक उपयोगकर्ता को एक दृश्य में कैसे जोड़ना है और डेटा को कैसे पास करना है। जो मैं समझ नहीं पा रहा हूं वह यह है कि आप इसे प्रत्येक कंट्रोलर में डेटा पुनर्प्राप्त करने और पास करने के बिना कैसे करते हैं?आप asp.net mvc में usercontrols का उपयोग कैसे करते हैं जो डेटा का "द्वीप" प्रदर्शित करता है?

उदाहरण के लिए, यदि मेरे पास उपयोगकर्ता नियंत्रण है जो साइट पर सभी पृष्ठों पर सबसे हालिया पोस्ट प्रदर्शित करता है लेकिन साइट के सभी पृष्ठों को नहीं, तो मैं नियंत्रकों को कैसे लिखूं ताकि मुझे उस उपयोगकर्ता नियंत्रण के लिए डेटा मिल सके और उपयोगकर्ता को पास कर सकें उपयोगकर्ता नियंत्रण में उपयोग किए जाने वाले प्रत्येक अलग-अलग नियंत्रकों में डेटा प्राप्त करने और पास करने की बजाय वेब साइट पर केवल एक ही स्थान से नियंत्रण?

मुझे यकीन नहीं है कि यह समझ में आता है या नहीं। क्या डेटा के "द्वीप" को संभालने के लिए एक बेहतर या अनुशंसित तरीका है जिसे आप कई पृष्ठों पर प्रदर्शित करना चाहते हैं?

मैं वेब फॉर्म से आ रहा हूं जहां मैं केवल एक उपयोगकर्ता नियंत्रण लिख सकता हूं जिसने अपना स्वयं का डेटा प्राप्त किया है और जिस भी पेज पर इसका उपयोग किया जाता है, उससे स्वतंत्र रूप से डेटा प्रदर्शित किया गया है।

उत्तर

11

ऐसा करने के कई तरीके हैं।

बुनियादी दृष्टिकोण

  • BaseController (OnActionExecuting घटना) में देखने
  • एक कस्टम क्रिया फिल्टर
  • एक आवेदन नियंत्रक (जैसे लेखन लेखन के लिए डेटा आबाद है। नीचे में है लिंक)।

OnActionExecuting का एक उदाहरण हो जाएगा

[HandleError] 
    public class BaseController : Controller 
    { 
     CourseService cs = new CourseService(); 
     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      List<Tag> tags = cs.GetTags(); 
      ViewData["Tags"] = tags; 
     } 

    } 

आप किसी भी दृश्य पर "टैग" दृश्य डेटा का उपयोग कर सकते हैं। यह केवल साइड कंटेंट के रूप में प्रस्तुत उपयोगकर्ता नियंत्रण का एक उदाहरण है।

<div id="sidebar_b"> 
     <asp:ContentPlaceHolder ID="ContentReferenceB" runat="server" > 
      <% Html.RenderPartial("Tags"); %> 
     </asp:ContentPlaceHolder> 
    </div> 

मैं निम्न URL पाया उपयोगी होने के लिए।

http://weblogs.asp.net/stephenwalther/archive/2008/08/12/asp-net-mvc-tip-31-passing-data-to-master-pages-and-user-controls.aspx

http://blog.matthidinger.com/2008/02/21/ASPNETMVCUserControlsStartToFinish.aspx

http://www.aaronlerch.com/blog/2008/01/26/displaying-foo-on-every-page-of-an-aspnet-mvc-application/

http://blog.wekeroad.com/2008/01/07/aspnet-mvc-using-usercontrols-usefully/

+0

दृढ़ता से टाइप किए गए दृश्य के साथ ऐसा करने के बारे में कोई विचार? –

+0

कभी नहीं, मैंने इसे ऑनएक्शन एक्स्क्टेड में रखा है, जो बहुत अच्छा काम करता है। –

0

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

ViewData["RecentPosts"] = RecentPosts.GetRecentPosts(this.GetType()); 

अपने नियंत्रण में, अच्छी तरह से ज्ञात कुंजी का उपयोग कर डेटा पुनः प्राप्त।

+0

क्या इसे कार्यान्वित करने का कोई तरीका है ताकि आपको प्रत्येक नियंत्रक में कक्षा/विधि कॉल करने की आवश्यकता न हो जो डेटा को पास करने के लिए डेटा को पास करने जा रहा है? – dtc

+0

वास्तव में नहीं - आपको किसी भी तरह व्यूडेटा में डेटा एकत्रित करना होगा। @ राजेश के उत्तर में आपके नियंत्रक को आधार वर्ग से प्राप्त करके इसे आसान बनाने पर कुछ सुझाव दिए गए हैं जो सभी बाल नियंत्रकों के लिए इसे लागू करता है। – tvanfosson

0
+0

आप उपरोक्त दृष्टिकोण की जांच कर सकते हैं जिसे मैंने साइड सामग्री के लिए हाइलाइट किया है। असल में मैं एक साइड सामग्री के रूप में "टैग" का उपयोग कर रहा हूं। आपके पास साइडकंटेंट "usercontrol" हो सकता है और बेस नियंत्रक में इसका डेटा पॉप्युलेट कर सकता है ताकि जब आवश्यक हो तो यह उपलब्ध हो। –

3

MVC वायदा में, codeplex पर उपलब्ध है, RenderAction HtmlHelper एक्सटेंशन में शामिल है।यह आपको यूज़र नियंत्रण के लिए नियंत्रक बनाने की अनुमति देगा और यह नियंत्रक उपयोगकर्ता नियंत्रक द्वारा उपयोग किए गए व्यूडेटा को आधार नियंत्रक का उपयोग किए बिना सुझाएगा जैसा सुझाव दिया गया था।

देखें में आप

<% Html.RenderAction("Index", "UserControlController") %> 

या अन्य भार के में से एक करना होगा।

यह नियंत्रक का एक उदाहरण बनाएगा, विधि निष्पादित करेगा और उपयोगकर्ता नियंत्रण दृश्य को मुख्य दृश्य में प्रस्तुत करेगा। मुख्य दृश्य नियंत्रक को उपयोगकर्ता नियंत्रण या उसके मॉडल/डेटा के बारे में कुछ भी जानने की आवश्यकता नहीं है।