2010-06-29 16 views
5

जबकि प्रतिस्थापन नियंत्रण में उपयोग की जाने वाली विधि को तारों को वापस करना चाहिए, तो सर्वर नियंत्रण पर वेब फ़ॉर्म में donut caching का उपयोग करना संभव है, जिसे सर्वर पक्ष प्रदान किया जाना चाहिए?
उदाहरण के लिए लॉगिनदृश्य नियंत्रण?प्रतिस्थापन नियंत्रण के अंदर ASP.Net सर्वर नियंत्रण का उपयोग कैसे करें?

उत्तर

6

अद्यतन अब यह एक पूरी तरह से काम कर रहा उदाहरण है। यहां कुछ चीजें हो रही हैं:

  1. आपको आवश्यक उपयोगकर्ता नियंत्रण के आउटपुट को प्रस्तुत करने के लिए प्रतिस्थापन नियंत्रण के कॉल का उपयोग करें।
  2. एक कस्टम पेज क्लास का उपयोग करें जो सत्यापन को लोड करने के लिए VerifyRenderingInServerForm और EnableEventValidation को ओवरराइड करता है ताकि उपयोगकर्ता नियंत्रण में सर्वर नियंत्रण हो, जिसके लिए फ़ॉर्म टैग या ईवेंट सत्यापन की आवश्यकता हो।

    <asp:Substitution runat="server" methodname="GetCustomersByCountry" /> 
    

    यहाँ कॉलबैक

    public string GetCustomersByCountry(string country) 
    { 
        CustomerCollection customers = DataContext.GetCustomersByCountry(country); 
    
        if (customers.Count > 0) 
         //RenderView returns the rendered HTML in the context of the callback 
         return ViewManager.RenderView("customers.ascx", customers); 
        else 
         return ViewManager.RenderView("nocustomersfound.ascx"); 
    } 
    

    यहाँ है उपयोगकर्ता नियंत्रण

    public class ViewManager 
    { 
        private class PageForRenderingUserControl : Page 
        { 
         public override void VerifyRenderingInServerForm(Control control) 
         { /* Do nothing */ } 
    
         public override bool EnableEventValidation 
         { 
          get { return false; } 
          set { /* Do nothing */} 
         } 
        } 
    
        public static string RenderView(string path, object data) 
        { 
         PageForRenderingUserControl pageHolder = new PageForUserControlRendering(); 
         UserControl viewControl = (UserControl) pageHolder.LoadControl(path); 
    
         if (data != null) 
         { 
          Type viewControlType = viewControl.GetType(); 
          FieldInfo field = viewControlType.GetField("Data"); 
          if (field != null) 
          { 
           field.SetValue(viewControl, data); 
          } 
          else 
          { 
           throw new Exception("ViewFile: " + path + "has no data property"); 
          } 
         } 
    
         pageHolder.Controls.Add(viewControl); 
         StringWriter result = new StringWriter(); 
         HttpContext.Current.Server.Execute(pageHolder, result, false); 
         return result.ToString(); 
        } 
    } 
    
    रेंडर करने के लिए सहायक वर्ग है:

यहाँ मार्कअप है

देखें इन प्रश्न:

+0

भयानक कोड के लिए! धन्यवाद – mohamadreza

+0

-1 संदर्भ स्रोत: http://weblogs.asp.net/scottgu/archive/2006/10/22/Tip_2F00_Trick_3A00_-Cool-UI- टेम्पलेटिंग- तकनीक- to-use-with-ASP.NET-AJAX-for -non_2D00_UpdatePanel-scenarios.aspx –

-1

मैं काफी निश्चित यदि आप ऐसा नहीं कर सकते हैं - प्रतिस्थापन नियंत्रण केवल आप एक outputcached पेज में एक स्ट्रिंग को सम्मिलित करने के लिए अनुमति देगा।
यह समझ में आता है, तो आप किसी सर्वर नियंत्रण के पूरे उत्पादन है, जो एक <table> कि आपके सभी सावधानी से गढ़ी गई मार्कअप और/या कुछ है कि पेज में इंजेक्शन <script> के एक लोड की आवश्यकता को बाधित करेंगे हो सकता है के बारे में सोचना - एक ही इंजेक्शन लगाने जबकि स्ट्रिंग ऐसा कुछ है जो अपेक्षाकृत सरल है।

0

एक बात Micah के जवाब बाहर छोड़ दिया जाता है कि प्रतिस्थापन समारोह static होना चाहिए, एक HttpContext पैरामीटर स्वीकार करते हैं, और एक वापसी string। अधिक जानकारी के लिए this msdn page देखें।

मैंने थोड़ा और अधिक लचीला होने के लिए Micah की सहायक कक्षा भी बढ़ा दी है।

मार्कअप

<asp:Substitution ID="Substitution1" MethodName="myFunction" runat="server" /> 

implemenationकरने के लिए

public static string myFunction(HttpContext httpContext){ 
    ViewManager vm = new ViewManager(); 

    //example using a Button control 

    Button b = new Button(); 
    b.Text = "click me"; //we can set properties like this 

    //we can also set properties with a Dictionary Collection 
    Dictionary<string,object> data = new Dictionary<string,object>(); 
    data.add("Visible",true); 

    String s = vm.RenderView(b,data); //don't do anything (just for example) 

    //we can also use this class for UserControls 
    UserControl myControl = vm.GetUserControl("~mypath"); 

    data.clear(); 
    data.add("myProp","some value"); 

    return vm.RenderView(myControl,data); //return for Substitution control 
} 

कक्षा

using System.IO; 
using System.ComponentModel; 
public class ViewManager 
{ 
    private PageForRenderingUserControl pageHolder; 
    public ViewManager() 
    { 
     pageHolder = new PageForRenderingUserControl(); 
    } 

    public UserControl GetUserControl(string path) 
    { 
     return (UserControl)pageHolder.LoadControl(path); 
    } 

    public string RenderView(Control viewControl, Dictionary<string, object> data) 
    { 
     pageHolder.Controls.Clear(); 
     //Dim viewControl As UserControl = DirectCast(pageHolder.LoadControl(Path), UserControl) 

     if (data != null) { 
      Type viewControlType = viewControl.GetType(); 


      dynamic properties = TypeDescriptor.GetProperties(viewControl); 

      foreach (string x in data.Keys) { 
       if ((properties.Item(x) != null)) { 
        properties.Item(x).SetValue(viewControl, data[x]); 
       } 
      } 
     } 

     pageHolder.Controls.Add(viewControl); 
     StringWriter result = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, result, false); 
     return result.ToString(); 
    } 

    private class PageForRenderingUserControl : Page 
    { 
     public override void VerifyRenderingInServerForm(Control control) 
     { 
      // Do nothing 
     } 

     public override bool EnableEventValidation { 
      get { return false; } 
      // Do nothing 
      set { } 
     } 
    } 

} 

धन्यवाद फिर से कोड

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

  • कोई संबंधित समस्या नहीं^_^