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