Author: igorz
Date: 2007-07-01 11:11:37 -0400 (Sun, 01 Jul 2007)
New Revision: 81146

Modified:
   trunk/mcs/class/System.Web.Extensions/System.Web.UI/ScriptManager.cs
   trunk/mcs/class/System.Web.Extensions/System.Web.UI/UpdatePanel.cs
Log:
improved partial rendering.

Modified: trunk/mcs/class/System.Web.Extensions/System.Web.UI/ScriptManager.cs
===================================================================
--- trunk/mcs/class/System.Web.Extensions/System.Web.UI/ScriptManager.cs        
2007-07-01 13:39:50 UTC (rev 81145)
+++ trunk/mcs/class/System.Web.Extensions/System.Web.UI/ScriptManager.cs        
2007-07-01 15:11:37 UTC (rev 81146)
@@ -87,6 +87,7 @@
                List<UpdatePanel> _updatePanels;
                ScriptReferenceCollection _scripts;
                bool _isInAsyncPostBack;
+               bool _isInPartialRendering;
                string _asyncPostBackSourceElementID;
                ScriptMode _scriptMode = ScriptMode.Auto;
                bool _enableScriptGlobalization;
@@ -235,6 +236,15 @@
                        }
                }
 
+               internal bool IsInPartialRendering {
+                       get {
+                               return _isInPartialRendering;
+                       }
+                       set {
+                               _isInPartialRendering = value;
+                       }
+               }
+
                [Category ("Behavior")]
                [DefaultValue (true)]
                public bool LoadScriptsBeforeUI {
@@ -397,15 +407,15 @@
                protected override void OnPreRender (EventArgs e) {
                        base.OnPreRender (e);
 
+                       Page.PreRenderComplete += new EventHandler 
(OnPreRenderComplete);
+
                        if (IsInAsyncPostBack) {
                                Page.SetRenderMethodDelegate 
(RenderPageCallback);
                        }
                        else {
-                               Page.PreRenderComplete += new EventHandler 
(OnPreRenderComplete);
-
                                if (EnableScriptGlobalization) {
                                        CultureInfo culture = 
Thread.CurrentThread.CurrentCulture;
-                                       string script = String.Format ("var 
__cultureInfo = '{0}';", _cultureInfoSerializer.Serialize (culture).Replace 
("'", "\\u0027"));
+                                       string script = String.Format ("var 
__cultureInfo = '{0}';", _cultureInfoSerializer.Serialize (culture));
                                        RegisterClientScriptBlock (this, typeof 
(ScriptManager), "ScriptGlobalization", script, true);
                                }
 
@@ -418,43 +428,59 @@
 
                void OnPreRenderComplete (object sender, EventArgs e) {
                        // Register Scripts
-                       List<ScriptReference> scripts = new 
List<ScriptReference> ();
-                       foreach (ScriptReference script in GetScriptReferences 
()) {
-                               OnResolveScriptReference (new 
ScriptReferenceEventArgs (script));
+                       List<ScriptReferenceEntry> scripts = new 
List<ScriptReferenceEntry> ();
+                       foreach (ScriptReferenceEntry script in 
GetScriptReferences ()) {
+                               OnResolveScriptReference (new 
ScriptReferenceEventArgs (script.ScriptReference));
                                scripts.Add (script);
                        }
                        for (int i = 0; i < scripts.Count; i++)
-                               RegisterScriptReference (scripts [i]);
+                               if (!IsInAsyncPostBack || HasBeenRendered 
(scripts [i].Control))
+                                       RegisterScriptReference (scripts 
[i].ScriptReference);
                }
 
-               IEnumerable<ScriptReference> GetScriptReferences () {
+               static bool HasBeenRendered (Control control) {
+                       if(control==null)
+                               return false;
+
+                       UpdatePanel parent = control.Parent as UpdatePanel;
+                       if (parent != null && parent.RequiresUpdate)
+                               return true;
+
+                       return HasBeenRendered (control.Parent);
+               }
+
+               IEnumerable<ScriptReferenceEntry> GetScriptReferences () {
                        ScriptReference script;
 
                        script = new ScriptReference ("MicrosoftAjax.js", 
String.Empty);
                        script.NotifyScriptLoaded = false;
-                       yield return script;
+                       yield return new ScriptReferenceEntry (this, script);
 
                        script = new ScriptReference 
("MicrosoftAjaxWebForms.js", String.Empty);
                        script.NotifyScriptLoaded = false;
-                       yield return script;
+                       yield return new ScriptReferenceEntry (this, script);
 
                        if (_scripts != null && _scripts.Count > 0) {
                                for (int i = 0; i < _scripts.Count; i++) {
-                                       yield return _scripts [i];
+                                       yield return new ScriptReferenceEntry 
(this, _scripts [i]);
                                }
                        }
 
                        if (_registeredScriptControls != null && 
_registeredScriptControls.Count > 0) {
                                for (int i = 0; i < 
_registeredScriptControls.Count; i++) {
-                                       foreach (ScriptReference s in 
_registeredScriptControls [i].GetScriptReferences ())
-                                               yield return s;
+                                       IEnumerable<ScriptReference> scripts = 
_registeredScriptControls [i].GetScriptReferences ();
+                                       if (scripts != null)
+                                               foreach (ScriptReference s in 
scripts)
+                                                       yield return new 
ScriptReferenceEntry ((Control) _registeredScriptControls [i], s);
                                }
                        }
 
                        if (_registeredExtenderControls != null && 
_registeredExtenderControls.Count > 0) {
                                foreach (IExtenderControl ex in 
_registeredExtenderControls.Keys) {
-                                       foreach (ScriptReference s in 
ex.GetScriptReferences ())
-                                               yield return s;
+                                       IEnumerable<ScriptReference> scripts = 
ex.GetScriptReferences ();
+                                       if (scripts != null)
+                                               foreach (ScriptReference s in 
scripts)
+                                                       yield return new 
ScriptReferenceEntry ((Control) ex, s);
                                }
                        }
                }
@@ -683,8 +709,10 @@
                }
 
                void RegisterScriptDescriptors (IEnumerable<ScriptDescriptor> 
scriptDescriptors) {
-                       if (IsInAsyncPostBack)
+                       if (scriptDescriptors == null)
                                return;
+                       if (IsInAsyncPostBack && !IsInPartialRendering)
+                               return;
 
                        StringBuilder sb = new StringBuilder ();
                        foreach (ScriptDescriptor scriptDescriptor in 
scriptDescriptors) {
@@ -1160,5 +1188,19 @@
                                return d;
                        }
                }
+
+               sealed class ScriptReferenceEntry
+               {
+                       public readonly Control _control;
+                       public readonly ScriptReference _scriptReference;
+
+                       public Control Control { get { return _control; } }
+                       public ScriptReference ScriptReference { get { return 
_scriptReference; } }
+
+                       public ScriptReferenceEntry (Control control, 
ScriptReference scriptReference) {
+                               _control = control;
+                               _scriptReference = scriptReference;
+                       }
+               }
        }
 }

Modified: trunk/mcs/class/System.Web.Extensions/System.Web.UI/UpdatePanel.cs
===================================================================
--- trunk/mcs/class/System.Web.Extensions/System.Web.UI/UpdatePanel.cs  
2007-07-01 13:39:50 UTC (rev 81145)
+++ trunk/mcs/class/System.Web.Extensions/System.Web.UI/UpdatePanel.cs  
2007-07-01 15:11:37 UTC (rev 81146)
@@ -205,7 +205,8 @@
                }
 
                protected override void RenderChildren (HtmlTextWriter writer) {
-                       if (ScriptManager.IsInAsyncPostBack && RequiresUpdate 
&& writer is ScriptManager.AlternativeHtmlTextWriter) {
+                       if (ScriptManager.IsInAsyncPostBack && RequiresUpdate 
&& !ScriptManager.IsInPartialRendering) {
+                               ScriptManager.IsInPartialRendering = true;
                                HtmlTextWriter responseOutput = 
((ScriptManager.AlternativeHtmlTextWriter) writer).ResponseOutput;
                                StringBuilder sb = new StringBuilder ();
                                HtmlTextWriter w = new HtmlTextWriter (new 
StringWriter (sb));
@@ -215,6 +216,8 @@
                                ScriptManager.WriteCallbackPanel 
(responseOutput, ClientID, sb);
                                for (int i = 0; i < sb.Length; i++)
                                        writer.Write (sb [i]);
+
+                               ScriptManager.IsInPartialRendering = false;
                        }
                        else
                                base.RenderChildren (writer);

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to