📄 ajaxmanager.cs
字号:
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 + -