From: Dion O. <dol...@us...> - 2006-01-20 01:36:07
|
Update of /cvsroot/magicajax/magicajax/Core/UI/Controls In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21237/magicajax/Core/UI/Controls Modified Files: AjaxPanel.cs Added Files: AjaxHtmlForm.cs Log Message: First support for scripts and hidden fields that were added during callback. Still beta! --- NEW FILE: AjaxHtmlForm.cs --- using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections; using System.Collections.Specialized; using System.Text.RegularExpressions; using System.Text; namespace MagicAjax.UI.Controls { /// <summary> /// TODO. As you can see, this code is not yet finished /// </summary> public class AjaxHtmlForm : System.Web.UI.HtmlControls.HtmlForm { public AjaxHtmlForm() { } private ArrayList _previousScriptFPs = new ArrayList(); private ArrayList _currentScriptFPs = new ArrayList(); protected override void RenderChildren(HtmlTextWriter writer) { if (MagicAjaxContext.Current.IsAjaxCall) { // Get the fingerprints of the scripts sent previous time if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != null) { _previousScriptFPs.AddRange(Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"].Split(';')); } ReflectHiddenFields(); //ReflectWebFormScript(); ?? ReflectClientScriptBlocks(); } else { SetAllScriptFingerPrints(); Page.ClientScript.RegisterHiddenField("__MAGICAJAX_SCRIPT_FINGERPRINTS", string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string)))); } base.RenderChildren(writer); if (MagicAjaxContext.Current.IsAjaxCall) { ReflectArrayDeclares(); //ReflectExpandoAttribute(); !! ReflectClientStartupScripts(); //set __MAGICAJAX_SCRIPT_FINGERPRINTS field string newFingerprints = string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string))); if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != newFingerprints) { AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_SCRIPT_FINGERPRINTS", string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string)))); } } } private void ReflectClientScriptBlocks() { IDictionary regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientScriptBlocks")); SetScriptDictionaryFingerPrints(regScripts, true); //TODO: _registeredOnSubmitStatements !! } private void ReflectClientStartupScripts() { IDictionary regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientStartupScripts")); SetScriptDictionaryFingerPrints(regScripts, true); } private void ReflectArrayDeclares() { IDictionary regArrays = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredArrayDeclares")); SetArrayDictionaryFingerPrints(regArrays, true); } private void SetAllScriptFingerPrints() { IDictionary regScripts; //ReflectWebFormScript(); ?? regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientScriptBlocks")); SetScriptDictionaryFingerPrints(regScripts, false); IDictionary regArrays = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredArrayDeclares")); SetArrayDictionaryFingerPrints(regArrays, false); //ReflectExpandoAttribute(); !! regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientStartupScripts")); SetScriptDictionaryFingerPrints(regScripts, false); } private void SetArrayDictionaryFingerPrints(IDictionary regArrays, bool reflectScripts) { if (regArrays != null) { foreach (DictionaryEntry fld in regArrays) { StringBuilder sb = new StringBuilder(); string key = (string)fld.Key; ArrayList values = (ArrayList)fld.Value; sb.Append("var "); sb.Append(key); sb.Append(" = new Array("); for (int i = 0; i<values.Count; i++) { if (i >0) sb.Append(", "); sb.Append((string)values[i]); } sb.Append(");"); string script = sb.ToString(); string scriptFP = Util.GetFingerprint(script); _currentScriptFPs.Add(scriptFP); if (reflectScripts && !_previousScriptFPs.Contains(scriptFP)) { NameValueCollection scriptAttributes = new NameValueCollection(); scriptAttributes.Add("type", "text/javascript"); AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); } } } } private void SetScriptDictionaryFingerPrints(IDictionary regScripts, bool reflectScripts) { if (regScripts != null) { foreach (DictionaryEntry fld in regScripts) { int keyHash = fld.Key.GetHashCode(); string script = (string)fld.Value; string scriptFP = Util.GetFingerprint(string.Format("{0}:{1}", keyHash, script)); _currentScriptFPs.Add(scriptFP); if (reflectScripts && !_previousScriptFPs.Contains(scriptFP)) { if (!script.StartsWith("\r\n<script")) { NameValueCollection scriptAttributes = new NameValueCollection(); scriptAttributes.Add("type", "text/javascript"); AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); } else { Match match = Util.ScriptTagsRegEx.Match(script); if (match.Success) { CaptureCollection attrnamesOption = match.Groups["attrname"].Captures; CaptureCollection attrvaluesOption = match.Groups["attrvalue"].Captures; NameValueCollection scriptAttributes = new NameValueCollection(); for (int j = 0; j < attrnamesOption.Count; j++) { scriptAttributes.Add(attrnamesOption[j].Value, attrvaluesOption[j].Value); } string scriptText = match.Groups["script"].Value; AjaxCallHelper.WriteAddScriptElementScript(scriptText, scriptAttributes); } } } } } } /// <summary> /// Reflects hidden fields back to client /// </summary> /// <param name="page"></param> private void ReflectHiddenFields() { IDictionary regFields = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredHiddenFields")); // for 1.1: IDictionary regFields = (IDictionary)(Util.GetPrivateField(Page, typeof(Page), "_registeredHiddenFields")); if (regFields != null) { foreach (DictionaryEntry fld in regFields) { string key = (string)fld.Key; string value = (string)fld.Value; // For now, don't reflect system hidden fields (starting with "__"). // TODO: find out why __VIEWSTATE is never registered...? if (key != null && !key.StartsWith("__")) { if (Page.Request.Form[key] == null) AjaxCallHelper.WriteAddHiddenFieldScript(key, value); else AjaxCallHelper.WriteSetFieldScript(key, value); } } } } } } Index: AjaxPanel.cs =================================================================== RCS file: /cvsroot/magicajax/magicajax/Core/UI/Controls/AjaxPanel.cs,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** AjaxPanel.cs 7 Jan 2006 08:03:47 -0000 1.49 --- AjaxPanel.cs 20 Jan 2006 01:35:56 -0000 1.50 *************** *** 275,279 **** } ! //disabling clientside validation inside AjaxPanels (not yet handled correctly) // Clientside validation throws errors when a validator becomes invisible // during an AjaxCall (the validator is gone while the script checking for --- 275,279 ---- } ! //disabling clientside validation inside AjaxPanels (not yet handled correctly for Page-store mode) // Clientside validation throws errors when a validator becomes invisible // during an AjaxCall (the validator is gone while the script checking for *************** *** 281,285 **** // TODO: Find a way to avoid problems of scripts that invisible controls // leave behind. ! DisableClientValidators(); } #endregion --- 281,289 ---- // TODO: Find a way to avoid problems of scripts that invisible controls // leave behind. ! ! if ( !this.MagicAjaxContext.IsPageNoStoreMode ) ! { ! DisableClientValidators(); ! } } #endregion *************** *** 1334,1338 **** if (HttpContext.Current.Request.Form[panelKey] != serializedPanelFingerprints) { ! AjaxCallHelper.WriteSetFieldScript(panelKey, serializedPanelFingerprints); } } --- 1338,1343 ---- if (HttpContext.Current.Request.Form[panelKey] != serializedPanelFingerprints) { ! //NOTE: reflecting hidden hields is done elsewhere ! //AjaxCallHelper.WriteSetFieldScript(panelKey, serializedPanelFingerprints); } } |