2011-11-28 15 views
5

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

कृपया मुझे समाधान खोजने में मदद करें।


मैंने उपर्युक्त विधि का उपयोग करके अपने पृष्ठ में उपयोगकर्ता नियंत्रण को सफलतापूर्वक लोड कर लिया है। हालांकि अब मैं लोड हो रहा है इस तरह के टैब कंटेनर, कैलेंडर एक्सटेंडर आदि के रूप में ajax नियंत्रण युक्त usercontrols में कठिनाई का सामना करना पड़ रहा ..

इस समस्या

+0

कृपया इन उपयोगी लिंक को देखें जो समस्या को हल करने का दावा करते हैं: - ["असिंक्रोनस विधियों और उपयोगकर्ता नियंत्रण"] (http://forums.asp.net/t/1468026.aspx/1) - ["एएसपी .NET - असीमित उपयोगकर्ता नियंत्रण "] (http://rsuharta.wordpress.com/2011/04/27/asp-net-asynchronous-user-control/) –

उत्तर

7

आप मुद्दों की एक गुच्छा में चलेंगे लिए चारों ओर किसी भी काम है: ViewState, नियंत्रण फॉर्म टैग की आवश्यकता है, पोस्टबैक काम नहीं करेंगे, लेकिन यदि आप इसे एक नियंत्रण के साथ कर रहे हैं जो पूरी तरह से View है तो यह ठीक काम करेगा।

स्क्रिप्ट:

//use .ready() or pageLoad() and pass params etc if you need to 
$.ajax({ 
    type: 'POST', 
    url: 'Default.aspx/GetControlViaAjax', 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { 
     $('#yourdiv').html(data.d); 
    } 
}); 

WebMethod:

[WebMethod] 
    public static string GetControlViaAjax() 
    { 
     //example public properties, send null if you don't have any 
     Dictionary<string, object> d = new Dictionary<string, object>(); 
     d.Add("CssClass", "YourCSSClass"); 
     d.Add("Title", "Your title"); 
     return RenderUserControl("/yourcontrol.ascx", true, d, null, null); 
     //use this one if your controls are compiled into a .dll 
     //return RenderUserControl(null, true, d, "Com.YourNameSpace.UI", "AwesomeControl"); 

    } 

प्रस्तुत विधि:

private static string RenderUserControl(string path, bool useFormLess, 
     Dictionary<string, object> controlParams, string assemblyName, string controlName) 
    { 

     Page pageHolder = null; 
     if (useFormLess) 
     { 
      pageHolder = new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //needed to resolve "~/" 
     } 
     else 
     { 
      pageHolder = new Page() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; 
     } 

     UserControl viewControl = null; 

     //use path by default 
     if(String.IsNullOrEmpty(path)) 
     {  
      //load assembly and usercontrol when .ascx is compiled into a .dll   
      string controlAssemblyName = string.Format("{0}.{1},{0}", assemblyName, controlName); 

      Type type = Type.GetType(controlAssemblyName);    
      viewControl = (UserControl)pageHolder.LoadControl(type, null); 
     } 
     else 
     { 
      viewControl = (UserControl)pageHolder.LoadControl(path);  

     }    

     viewControl.EnableViewState = false; 

     if (controlParams != null && controlParams.Count > 0) 
     { 
      foreach (var pair in controlParams) 
      { 
       Type viewControlType = viewControl.GetType(); 
       PropertyInfo property = 
        viewControlType.GetProperty(pair.Key); 

       if (property != null) 
       { 
        property.SetValue(viewControl, pair.Value, null); 
       } 
       else 
       { 
        throw new Exception(string.Format(
         "UserControl: {0} does not have a public {1} property.", 
         path, pair.Key)); 
       } 
      } 
     } 

     if (useFormLess) 
     {     
      pageHolder.Controls.Add(viewControl); 
     } 
     else 
     { 
      HtmlForm form = new HtmlForm(); 
      form.Controls.Add(viewControl); 
      pageHolder.Controls.Add(form); 
     } 
     StringWriter output = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return output.ToString(); 
    } 

FormlessPage वर्ग:

public class FormlessPage : Page 
    { 
     public override void VerifyRenderingInServerForm(Control control) 
     { 
     } 
    } 
+0

उपरोक्त कोड मुझे निम्नानुसार त्रुटि देता है .. एक ऑब्जेक्ट गैर स्थैतिक फ़ील्ड, विधि, या प्रॉपर्टी 'System.Web.UI.TemplateControl.LoadControl (System.Type, ऑब्जेक्ट []) के लिए संदर्भ आवश्यक है' – Suhaib

+0

मुझे रेंडर विधि कहां लिखनी चाहिए? पृष्ठ में या उपयोगकर्ता नियंत्रण में? उपयोगकर्ता नियंत्रण में डेटा भरने के लिए कोड कहां होगा? मैं उपयोगकर्ता नियंत्रण के लिए बहुत नया हूँ। तो बेहतर होगा अगर आप उपर्युक्त विधि को थोड़ा और समझा सकें .. बहुत धन्यवाद .. – Suhaib

+0

यदि आप केवल उपयोगकर्ता नियंत्रण को लिखना सीख रहे हैं तो यह बेहद उन्नत है। –

0

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

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