Utility.cs
上传用户:szgaoree
上传日期:2009-01-05
资源大小:74k
文件大小:12k
源码类别:

Ajax

开发平台:

C#

  1. /*
  2.  * 
  3.  * MS 05-12-20 changed AjaxSettins access, now thread safe for web farms
  4.  * MS 06-04-05 fixed sessionID on ASP.NET 2.0, new static method GetSessionUri
  5.  * MS 06-04-12 added useAssemblyQualifiedName
  6.  * 
  7.  * 
  8.  * 
  9.  */
  10. using System;
  11. using System.Text;
  12. using System.Reflection;
  13. using System.Collections;
  14. using System.Collections.Specialized;
  15. namespace AjaxPro
  16. {
  17. /// <summary>
  18. /// Provides methods to register Ajax methods.
  19. /// </summary>
  20. public sealed class Utility
  21. {
  22. /// <summary>
  23. /// Set the HandlerExtension configured in web.config/configuration/system.web/httpHandlers/add/@path:
  24. /// </summary>
  25. public static string HandlerExtension = ".ashx";
  26. /// <summary>
  27. /// Set the HandlerPath configured in web.config/configuration/system.web/httpHandlers/add/@path:
  28. /// </summary>
  29. public static string HandlerPath = "ajaxpro";
  30. private static AjaxSettings m_Settings = null;
  31. private static object m_SettingsLock = new object();
  32. internal static bool ConverterRegistered = false;
  33. /// <summary>
  34. /// Returns the session identifier.
  35. /// </summary>
  36. /// <returns>Returns the URL part for the session identifier.</returns>
  37. internal static string GetSessionUri()
  38. {
  39. string cookieUri = "";
  40. if (System.Web.HttpContext.Current.Session != null && System.Web.HttpContext.Current.Session.IsCookieless)
  41. {
  42. #if(NET20)
  43. cookieUri = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_ASPFILTERSESSIONID"];
  44. #else
  45. cookieUri = "(" + System.Web.HttpContext.Current.Session.SessionID + ")";
  46. #endif
  47. }
  48. if (cookieUri != null && cookieUri.Length != 0)
  49. cookieUri += "/";
  50. return cookieUri;
  51. }
  52. /// <summary>
  53. /// Returns the name of the class and method the AjaxMethod will be rendered to the client-side JavaScript.
  54. /// </summary>
  55. /// <param name="method">The method you want to call.</param>
  56. /// <returns>Returns a string separated by a comma, i.e. "MyNamespace.MyClass,MyMethod"</returns>
  57. [Obsolete("The recommended alternative is AjaxPro.ClientMethod.FromMethodInfo.", false)]
  58. public static string GetClientMethod(MethodInfo method)
  59. {
  60. ClientMethod cm = ClientMethod.FromMethodInfo(method);
  61. if(cm == null)
  62. return null;
  63. return cm.ClassName + "," + cm.MethodName;
  64. }
  65. /// <summary>
  66. /// Writes an enum representation to the current page.
  67. /// </summary>
  68. /// <param name="type">The type of the enum.</param>
  69. public static void RegisterEnumForAjax(Type type)
  70. {
  71. System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler;
  72. RegisterEnumForAjax(type, page);
  73. }
  74. /// <summary>
  75. /// Writes an enum representation to the current page.
  76. /// </summary>
  77. /// <param name="type">The type of the enum.</param>
  78. /// <param name="page">The page where the JavaScript shoult be rendered in.</param>
  79. public static void RegisterEnumForAjax(Type type, System.Web.UI.Page page)
  80. {
  81. RegisterCommonAjax(page);
  82. RegisterClientScriptBlock(page, Constant.AjaxID + ".AjaxEnum." + type.FullName,
  83. "<script type="text/javascript">rn" + JavaScriptUtil.GetEnumRepresentation(type) + "</script>");
  84. }
  85. /// <summary>
  86. /// Register the specified type (class) for the current page. This will also add the common JavaScript file.
  87. /// </summary>
  88. /// <param name="type">The tpye to register i.e. RegisterTypeForAjax(typeof(WebApplication1.WebForm1));</param>
  89. public static void RegisterTypeForAjax(Type type)
  90. {
  91. System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler;
  92. RegisterTypeForAjax(type, page);
  93. }
  94. /// <summary>
  95. /// Register the specified type (class) for the current page. This will also add the common JavaScript file.
  96. /// </summary>
  97. /// <param name="type">The tpye to register i.e. RegisterTypeForAjax(typeof(WebApplication1.WebForm1));</param>
  98. /// <param name="page">The Page the script should rendered on.</param>
  99. public static void RegisterTypeForAjax(Type type, System.Web.UI.Page page)
  100. {
  101. RegisterCommonAjax(page);
  102. string path = type.FullName + "," + type.Assembly.FullName.Substring(0, type.Assembly.FullName.IndexOf(","));
  103. if(Utility.Settings.UseAssemblyQualifiedName) path = type.AssemblyQualifiedName;
  104. if(Utility.Settings != null && Utility.Settings.UrlNamespaceMappings.ContainsValue(path))
  105. {
  106. foreach(string key in Utility.Settings.UrlNamespaceMappings.Keys)
  107. {
  108. if(Utility.Settings.UrlNamespaceMappings[key].ToString() == path)
  109. {
  110. path = key;
  111. break;
  112. }
  113. }
  114. }
  115. RegisterClientScriptBlock(page, "AjaxType." + type.FullName,
  116. "<script type="text/javascript" src="" + System.Web.HttpContext.Current.Request.ApplicationPath + (System.Web.HttpContext.Current.Request.ApplicationPath.EndsWith("/") ? "" : "/") + Utility.HandlerPath + "/" + GetSessionUri() + path + Utility.HandlerExtension + ""></script>");
  117. }
  118. public static void RegisterConverterForAjax(IJavaScriptConverter converter)
  119. {
  120. Utility.Settings.JavaScriptConverters.Add(converter);
  121. }
  122. #region Internal Members
  123. /// <summary>
  124. /// Get the settings configured in web.config.
  125. /// </summary>
  126. internal static AjaxSettings Settings
  127. {
  128. get
  129. {
  130. if(m_Settings != null)
  131. return m_Settings;
  132. lock(m_SettingsLock)
  133. {
  134.                     if (m_Settings != null)
  135.                         return m_Settings;      // Ok, one other thread has already initialized this value.
  136. AjaxSettings settings = null;
  137. try
  138. {
  139. #if(NET20)
  140. settings = (AjaxSettings)System.Configuration.ConfigurationManager.GetSection("ajaxNet/ajaxSettings");
  141. #else
  142. settings = (AjaxSettings)System.Configuration.ConfigurationSettings.GetConfig("ajaxNet/ajaxSettings");
  143. #endif
  144. }
  145. catch(Exception)
  146. {}
  147. if(settings == null)
  148. settings = new AjaxSettings();
  149. #region Default Converters
  150. settings.JavaScriptConverters.Add(new NameValueCollectionConverter());
  151. settings.JavaScriptConverters.Add(new DateTimeConverter());
  152. settings.JavaScriptConverters.Add(new DataRowConverter());
  153. settings.JavaScriptConverters.Add(new DataTableConverter());
  154. settings.JavaScriptConverters.Add(new DataSetConverter());
  155. settings.JavaScriptConverters.Add(new DataViewConverter());
  156. settings.JavaScriptConverters.Add(new HtmlControlConverter());
  157. settings.JavaScriptConverters.Add(new IListConverter());
  158. settings.JavaScriptConverters.Add(new IDictionaryConverter());
  159. settings.JavaScriptConverters.Add(new IEnumerableConverter());
  160. #endregion
  161. // now make the setting visible to all threads
  162. m_Settings = settings;
  163. return m_Settings;
  164. }
  165. }
  166. }
  167. internal static string CurrentAjaxToken
  168. {
  169. get
  170. {
  171. if(System.Web.HttpContext.Current == null || System.Web.HttpContext.Current.Request == null)
  172. return null;
  173. if(Utility.Settings == null)
  174. return null;
  175. string token = "";
  176. string ip = MD5Helper.GetHash(System.Web.HttpContext.Current.Request.UserHostAddress);
  177. string agent = MD5Helper.GetHash(System.Web.HttpContext.Current.Request.UserAgent);
  178. string site = MD5Helper.GetHash("Michael Schwarz" + Utility.Settings.TokenSitePassword);
  179. if(ip == null || ip.Length == 0 || agent == null || agent.Length == 0 || site == null || site.Length == 0)
  180. return null;
  181. token = ip.Substring(0, 5) + "-" + agent.Substring(0, 5) + "-" + site.Substring(0, 5);
  182. return MD5Helper.GetHash(token);
  183. }
  184. }
  185. /// <summary>
  186. /// Register the common JavaScript to the current handler.
  187. /// </summary>
  188. internal static void RegisterCommonAjax()
  189. {
  190. RegisterCommonAjax((System.Web.UI.Page)System.Web.HttpContext.Current.Handler);
  191. }
  192. /// <summary>
  193. /// Register the common JavaScript file for the specified page.
  194. /// </summary>
  195. /// <param name="page">The Page the client script should be rendered to.</param>
  196. internal static void RegisterCommonAjax(System.Web.UI.Page page)
  197. {
  198. if(page == null)
  199. return;
  200. // If there is a configuration for this fileName in
  201. // web.config AjaxPro section scriptReplacements we will
  202. // redirect to this file.
  203. string rootFolder = System.Web.HttpContext.Current.Request.ApplicationPath + (System.Web.HttpContext.Current.Request.ApplicationPath.EndsWith("/") ? "" : "/");
  204. string prototypeJs = rootFolder + Utility.HandlerPath + "/prototype" + Utility.HandlerExtension;
  205. string coreJs = rootFolder + Utility.HandlerPath + "/core" + Utility.HandlerExtension;
  206. string convertersJs = rootFolder + Utility.HandlerPath + "/converter" + Utility.HandlerExtension;
  207. if(Utility.Settings != null)
  208. {
  209. if(Utility.Settings.ScriptReplacements.ContainsKey("prototype"))
  210. {
  211. prototypeJs = Utility.Settings.ScriptReplacements["prototype"];
  212. if(prototypeJs.Length > 0 && prototypeJs.StartsWith("~/"))
  213. prototypeJs = rootFolder + prototypeJs.Substring(2);
  214. }
  215. if(Utility.Settings.ScriptReplacements.ContainsKey("core"))
  216. {
  217. coreJs = Utility.Settings.ScriptReplacements["core"];
  218. if(coreJs.Length > 0 && coreJs.StartsWith("~/"))
  219. coreJs = rootFolder + coreJs.Substring(2);
  220. }
  221. if(Utility.Settings.ScriptReplacements.ContainsKey("converter"))
  222. {
  223. convertersJs = Utility.Settings.ScriptReplacements["converter"];
  224. if(convertersJs.Length > 0 && convertersJs.StartsWith("~/"))
  225. convertersJs = rootFolder + convertersJs.Substring(2);
  226. }
  227. }
  228. if(prototypeJs.Length > 0)
  229. RegisterClientScriptBlock(page, Constant.AjaxID + ".prototype",
  230. "<script type="text/javascript" src="" + prototypeJs + ""></script>");
  231. if(coreJs.Length > 0)
  232. RegisterClientScriptBlock(page, Constant.AjaxID + ".core",
  233. "<script type="text/javascript" src="" + coreJs + ""></script>");
  234. if(convertersJs.Length > 0)
  235. RegisterClientScriptBlock(page, Constant.AjaxID + ".converters",
  236. "<script type="text/javascript" src="" + convertersJs + ""></script>");
  237. if(Settings.TokenEnabled)
  238. {
  239. RegisterClientScriptBlock(page, Constant.AjaxID + ".token",
  240. "<script type="text/javascript">AjaxPro.token = "" + CurrentAjaxToken + "";</script>");
  241. }
  242. }
  243. internal static HybridDictionary pages = new HybridDictionary();
  244. internal static ListDictionary GetScripts(System.Web.UI.Page page, bool RemoveFromCollection)
  245. {
  246. lock(pages.SyncRoot)
  247. {
  248. ListDictionary scripts = (ListDictionary)pages[page];
  249. if(RemoveFromCollection && scripts != null)
  250. {
  251. pages.Remove(page);
  252. }
  253. if(!RemoveFromCollection && scripts == null)
  254. {
  255. scripts = new System.Collections.Specialized.ListDictionary();
  256. pages[page] = scripts;
  257. }
  258. return scripts;
  259. }
  260. }
  261. internal static ListDictionary GetScripts(System.Web.UI.Page page)
  262. {
  263. return GetScripts(page, false);
  264. }
  265.         
  266. internal static void RegisterClientScriptBlock(System.Web.UI.Page page, string key, string script)
  267. {
  268. page.PreRender += new EventHandler(page_PreRender);
  269. ListDictionary scripts = GetScripts(page);
  270. if (scripts.Contains(key))
  271. return;
  272.             
  273. scripts.Add(key, script);
  274. }
  275. private static void page_PreRender(object sender, EventArgs e)
  276. {
  277. System.Web.UI.Page page = (System.Web.UI.Page)sender;
  278. ListDictionary scripts = GetScripts(page, true);
  279. if (scripts == null)
  280. return;
  281. StringBuilder sb = new StringBuilder();
  282. sb.Append("rn");
  283. foreach(string script in scripts.Values)
  284. {
  285. sb.Append(script);
  286. sb.Append("rn");
  287. }
  288. if(page != null)
  289. #if(NET20)
  290.                 // TODO: replace by page.RegisterClientScriptInclude
  291.                 page.RegisterClientScriptBlock(Constant.AjaxID, sb.ToString());
  292. #else
  293. page.RegisterClientScriptBlock(Constant.AjaxID, sb.ToString());
  294. #endif
  295. }
  296. #endregion
  297. }
  298. }