⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ajaxmanager.cs

📁 ASP.NET简洁论坛源代码 这是一个简单的论坛
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections;
using System.Data;
using System.Globalization;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using System.Web;
using System.Web.UI;

namespace NetFocus.Web.Applications.Forum
{
	[AttributeUsage(AttributeTargets.Method)]
	public class AjaxMethodAttribute : Attribute
	{
		public AjaxMethodAttribute()
		{
			_includeControlValuesWithCallBack = true;
		}

		private string _clientSideName;

		public string ClientSideName
		{
			get { return _clientSideName; }
			set { _clientSideName = value; }
		}

		private bool _includeControlValuesWithCallBack;

		public bool IncludeControlValuesWithCallBack
		{
			get { return _includeControlValuesWithCallBack; }
			set { _includeControlValuesWithCallBack = value; }
		}
	}

	[Flags]
	public enum AjaxDebug
	{
		None         = 0,
		RequestText  = 1,
		ResponseText = 2,
		Errors       = 4,
		All          = 7
	}

	public class AjaxManager
	{
		public static void RegisterLoginPage(Page page)
		{
			page.PreRender += new EventHandler(OnLoginPagePreRender);
		}

		private static void OnLoginPagePreRender(object sender, EventArgs e)
		{
			HttpContext context = HttpContext.Current;
			HttpRequest req = context.Request;
			string returnURL = req.QueryString["ReturnURL"];
			if (returnURL != null && returnURL.Length > 0)
			{
				returnURL = context.Server.UrlDecode(returnURL);
				if (returnURL.EndsWith("?Ajax_CallBack=true") ||
					returnURL.EndsWith("&Ajax_CallBack=true"))
				{
					HttpResponse resp = context.Response;
					WriteResult(resp, null, "LOGIN");
					resp.End();
				}
			}
		}

		public static void Register(Page page)
		{
			Register(page, page.GetType().FullName, false, AjaxDebug.None);
		}

		public static void Register(Page page, string prefix)
		{
			Register(page, prefix, false, AjaxDebug.None);
		}

		public static void Register(Page page, AjaxDebug debug)
		{
			Register(page, page.GetType().FullName, false, debug);
		}

		public static void Register(Page page, string prefix, AjaxDebug debug)
		{
			Register(page, prefix, false, debug);
		}

		public static void Register(Control control)
		{
			Register(control, control.GetType().FullName, true, AjaxDebug.None);
		}

		public static void Register(Control control, string prefix)
		{
			Register(control, prefix, true, AjaxDebug.None);
		}

		public static void Register(Control control, AjaxDebug debug)
		{
			Register(control, control.GetType().FullName, true, debug);
		}

		public static void Register(Control control, string prefix, bool requireId, AjaxDebug debug)
		{
//			RegisterCount += 1;

			HttpContext context = HttpContext.Current;

			
//			string url =  context.Request.RawUrl;
//			string currentExecutionFilePath = context.Request.CurrentExecutionFilePath;
//			string filePath = context.Request.FilePath;
//			if (object.ReferenceEquals(currentExecutionFilePath, filePath))
//			{
//				url = filePath;
//				int lastSlash = url.LastIndexOf('/');
//				if (lastSlash != -1)
//				{
//					url = url.Substring(lastSlash + 1);
//				}
//			}
//			else
//			{
//				Uri from = new Uri("file://foo" + filePath, true);
//				Uri to = new Uri("file://foo" + currentExecutionFilePath, true);
//				url = from.MakeRelative(to);
//			}
//			string queryString = context.Request.Url.Query;

			// this is now calculated in the javascript...
//			if(url.IndexOf("?") > -1)
//			//if (queryString != null && queryString.Length != 0)
//			{
//				//url = url + queryString + "&Ajax_CallBack=true";
//				url = url + "&Ajax_CallBack=true";
//			}
//			else
//			{
//				url += "?Ajax_CallBack=true";
//			}


			Type type = control.GetType();
			StringBuilder controlScript = new StringBuilder();
			controlScript.Append("<script language=\"javascript\" type=\"text/javascript\">\n");
			string[] prefixParts = prefix.Split('.', '+');
			controlScript.AppendFormat("var {0} = {{\n", prefixParts[0]);
			for (int i = 1; i < prefixParts.Length; ++i)
			{
				controlScript.AppendFormat("\"{0}\": {{\n", prefixParts[i]);
			}
			int methodCount = 0;
			foreach (MethodInfo methodInfo in type.GetMethods(BindingFlags.Instance | BindingFlags.Public))
			{
				object[] attributes = methodInfo.GetCustomAttributes(typeof(AjaxMethodAttribute), true);
				if (attributes != null && attributes.Length > 0)
				{
					AjaxMethodAttribute methodAttribute = attributes[0] as AjaxMethodAttribute;
					string clientSideName = methodAttribute.ClientSideName != null ? methodAttribute.ClientSideName : methodInfo.Name;
					++methodCount;
					controlScript.AppendFormat("\"{0}\":function(", clientSideName);
					if (requireId)
					{
						controlScript.AppendFormat("id,");
					}
					int paramCount = methodInfo.GetParameters().Length;

					for (int i = 0; i < paramCount; i++)
					{
						controlScript.Append("p");
						controlScript.Append(i.ToString());
						controlScript.Append(",");
					}

//					foreach (ParameterInfo paramInfo in methodInfo.GetParameters())
//					{
//						controlScript.Append(paramInfo.Name + ",");
//					}
					controlScript.AppendFormat(
						"cb){{return Ajax_CallBack('{0}',{1},'{2}',[",
						type.FullName,
						requireId ? "id" : "null",
						methodInfo.Name);
					
					for (int i = 0; i < paramCount; i++)
					{
						if (i > 0)
							controlScript.Append(",");

						controlScript.Append("p");
						controlScript.Append(i.ToString());
					}
//					foreach (ParameterInfo paramInfo in methodInfo.GetParameters())
//					{
//						++paramCount;
//						controlScript.Append(paramInfo.Name);
//						controlScript.Append(",");
//					}
//					// If parameters were written, remove the
//					// trailing comma.
//					if (paramCount > 0)
//					{
//						--controlScript.Length;
//					}
					controlScript.AppendFormat("],cb,{0},{1},{2},{3});}}",
						(debug & AjaxDebug.RequestText) == AjaxDebug.RequestText ? "1" : "0",
						(debug & AjaxDebug.ResponseText) == AjaxDebug.ResponseText ? "1" : "0",
						(debug & AjaxDebug.Errors) == AjaxDebug.Errors ? "1" : "0",
						(methodAttribute.IncludeControlValuesWithCallBack ? "1" : "0"));

					controlScript.Append(",\n");
				}
			}
			// If no methods were found, you probably forget to add
			// [Ajax.Method] attributes to your methods or they weren't public.
			if (methodCount == 0)
			{
				throw new ApplicationException(string.Format("{0} does not contain any public methods with the Ajax.Method attribute.", type.FullName));
			}
			// Remove the trailing comma and newline.
			controlScript.Length -= 2;
			for (int i = 0; i < prefixParts.Length; ++i)
			{
				controlScript.Append("}");
			}
			controlScript.Append(";\n</script>");
			control.Page.ClientScript.RegisterClientScriptBlock(control.Page.GetType(), "AjaxManager:" + prefix, controlScript.ToString());
			control.PreRender += new EventHandler(OnPreRender);
		}

//		public static int RegisterCount
//		{
//			get
//			{
//				return HttpContext.Current.Items.Contains("Ajax_RegisterCount")
//					? (int)HttpContext.Current.Items["Ajax_RegisterCount"]
//					: 0;
//			}
//
//			set
//			{
//				HttpContext.Current.Items["Ajax_RegisterCount"] = value;
//			}
//		}

//		public static int CallBackAttemptCount
//		{
//			get
//			{
//				return HttpContext.Current.Items.Contains("Ajax_CallBackAttemptCount")
//					? (int)HttpContext.Current.Items["Ajax_CallBackAttemptCount"]
//					: 0;
//			}
//
//			set
//			{
//				HttpContext.Current.Items["Ajax_CallBackAttemptCount"] = value;
//			}
//		}

		public static string CallBackType
		{
			get
			{
				return HttpContext.Current.Request.Form["Ajax_CallBackType"];
			}
		}

		public static string CallBackId
		{
			get
			{
				return HttpContext.Current.Request.Form["Ajax_CallBackId"];
			}
		}

		public static string CallBackMethod
		{
			get
			{
				return HttpContext.Current.Request.Form["Ajax_CallBackMethod"];
			}
		}

		public static bool IsCallBack
		{
			get
			{
				return CallBackType != null;
			}
		}

		static void OnPreRender(object s, EventArgs e)
		{
			if (IsCallBack)
			{
				// CallBackAttemptCount += 1;
				Control control = s as Control;

				MethodInfo methodInfo = null;
				if (control != null)
				{
					if (control.GetType().FullName == CallBackType || control is Page)
					{
						if (control is Page || control.ClientID == CallBackId)
						{
							methodInfo = FindTargetMethod(control);
						}
					}
				}
				object val = null;
				string error = null;
				HttpResponse resp = HttpContext.Current.Response;
				if (methodInfo != null)
				{
					try
					{
						object[] parameters = ConvertParameters(methodInfo, HttpContext.Current.Request);
						val = InvokeMethod(control, methodInfo, parameters);
					}
					catch (Exception ex)
					{
						error = ex.Message;
					}
					WriteResult(resp, val, error);
					resp.End();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -