Browse Source

2009-09-28 Marek Habersack <[email protected]>

	* UpdatePanel.cs: RenderChildren stores the alternative writer in
	a private property, for the benefit of nested child panels. Fixes
	bug #542441

svn path=/trunk/mcs/; revision=142780
Marek Habersack 16 năm trước cách đây
mục cha
commit
7970f6efa8

+ 4 - 0
mcs/class/System.Web.Extensions/System.Web.UI/ChangeLog

@@ -1,5 +1,9 @@
 2009-09-28  Marek Habersack  <[email protected]>
 
+	* UpdatePanel.cs: RenderChildren stores the alternative writer in
+	a private property, for the benefit of nested child panels. Fixes
+	bug #542441
+
 	* ScriptManager.cs: don't render invisible panel IDs during async
 	request. Fixes bug #542533
 

+ 42 - 9
mcs/class/System.Web.Extensions/System.Web.UI/UpdatePanel.cs

@@ -200,6 +200,9 @@ namespace System.Web.UI
 				_updateMode = value;
 			}
 		}
+
+		// Used by nested panels (see bug #542441)
+		ScriptManager.AlternativeHtmlTextWriter RenderChildrenWriter { get; set; }
 		
 		protected virtual Control CreateContentTemplateContainer ()
 		{
@@ -257,22 +260,52 @@ namespace System.Web.UI
 			writer.RenderEndTag ();
 		}
 
+		UpdatePanel FindParentPanel ()
+		{
+			Control parent = Parent;
+			while (parent != null) {
+				UpdatePanel panel = parent as UpdatePanel;
+				if (panel != null)
+					return panel;
+
+				parent = parent.Parent;
+			}
+
+			return null;
+		}
+		
 		protected override void RenderChildren (HtmlTextWriter writer)
 		{
+			RenderChildrenWriter = null;
+			
 			if (IsInPartialRendering) {
 				ScriptManager.AlternativeHtmlTextWriter altWriter = writer as ScriptManager.AlternativeHtmlTextWriter;
 				if (altWriter == null)
 					altWriter = writer.InnerWriter as ScriptManager.AlternativeHtmlTextWriter;
-				if (altWriter == null)
+				
+				if (altWriter == null) {
+					UpdatePanel parentPanel = FindParentPanel ();
+					if (parentPanel != null)
+						altWriter = parentPanel.RenderChildrenWriter;
+				}
+
+				if (altWriter == null) {
+					Console.WriteLine (Environment.StackTrace);
 					throw new InvalidOperationException ("Internal error. Invalid writer object.");
-					
-				HtmlTextWriter responseOutput = altWriter.ResponseOutput;
-				StringBuilder sb = new StringBuilder ();
-				HtmlTextWriter w = new HtmlTextWriter (new StringWriter (sb));
-				base.RenderChildren (w);
-				w.Flush ();
-					
-				ScriptManager.WriteCallbackPanel (responseOutput, this, sb);
+				}
+
+				// Used by nested panels (see bug #542441)
+				RenderChildrenWriter = altWriter;
+				try {
+					HtmlTextWriter responseOutput = altWriter.ResponseOutput;
+					StringBuilder sb = new StringBuilder ();
+					HtmlTextWriter w = new HtmlTextWriter (new StringWriter (sb));
+					base.RenderChildren (w);
+					w.Flush ();
+					ScriptManager.WriteCallbackPanel (responseOutput, this, sb);
+				} finally {
+					RenderChildrenWriter = null;
+				}
 			} else
 				base.RenderChildren (writer);
 		}