あるプロジェクトで、テンプレートフィールドエンジンを設計し、html jqueryを使用して実装しました。ここでのデータを取得するには必然的にajaxが必要になりますが、チームにはjsの知識が異なるため、開発を簡素化できる次の補助クラスを作成しました。 ajaxはajaxproのようなものです。
Code-jQueryInvokeMethodAttribute (ここではメソッドのマーキングのみが行われるため、空です):
システムを使用しています。
System.Collections.Generic を使用;
System.Linq を使用;
System.Text を使用;
namespace Green.Utility
{
public class jQueryAjaxUtility
{
public static string AjaxInvokeParam = "AjaxInvoke";
パブリック静的文字列 AjaxInvokeValue = "1";
パブリック静的文字列 ResponseCharset = "UTF-8";
保護された静的 System.Web.UI.Page ページ
{
get
{
return System.Web.HttpContext.Current.Handler as System.Web.UI.Page;
}
}
public static void RegisterClientAjaxScript(Type type)
{
if (Page != null)
{
if (System.Web.HttpContext.Current. Request[AjaxInvokeParam] == AjaxInvokeValue)
{
RegisterAjaxInvokeEvent(type);
}
else
{
RegisterAjaxInvokeScript(type);
}
}
}
protected static void RegisterAjaxInvokeScript(Type type)
{
Page.ClientScript.RegisterClientScriptBlock(type.GetType(), type.GetType().FullName " _" typeof(jQueryAjaxUtility).FullName "_AjaxInvokeDefaultOption", "window.defaultAjaxOption={type:'GET',cache:false, dataType:'text'};", true);
if (!jQueryUtilityCache.Current.Exists(type))
{
var methodinfo = type.GetMethods(System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags .Public).Where(t =>
{
var attrs = t.GetCustomAttributes(typeof(jQueryInvokeMethodAttribute), false);
if (attrs != null && attrs.Length > 0)
true を返す;
false を返す
}).ToList();
if (methodinfo != null && methodinfo.Count > 0)
{
System.Text.StringBuilder sb = new StringBuilder();
sb.AppendFormat(" window.{0}=function(){{}}; ", type.Name);
methodinfo.ForEach(t =>
{
varparameters = t.GetParameters().Select(p => p.Name).ToArray();
sb.AppendFormat(" {2}.{0} = function ({1} ajaxOption) {{", t.Name,parameters.Count() > 0 ? string.Join(",",parameters) "," : "", type .Name);
sb.Append("if(ajaxOption==null||typeof ajaxOption=='unknown'){ajaxOption={};};"); .IndexOf("?") == -1 ? Page.Request.RawUrl : Page.Request.RawUrl.Substring(0, Page.Request.RawUrl.IndexOf("?") ); ajaxOption.url = '{0}';", url);
var data = "''";
if (parameters.Count() > 0)
{
data = ( string.Join(" ",parameters.Select(p => string.Format("'&{0}=' {0} ", p)).ToArray())); (' ');
}
sb.AppendFormat("ajaxOption.data = 'method={1}&rn={4}&{2}={3}' {0};", データ, t .Name, AjaxInvokeParam, AjaxInvokeValue,Guid.NewGuid().ToString());
sb.Append("ajaxOption= jQuery.extend(window.defaultAjaxOption,ajaxOption);"); jQuery.ajax(ajaxOption);};");
});
jQueryUtilityCache.Current.AddScript(type, sb.ToString());
}
}
var script = jQueryUtilityCache.Current.GetScript(type);
Page.ClientScript.RegisterClientScriptBlock(type.GetType(), type.GetType().FullName "_" typeof(jQueryAjaxUtility).FullName "_AjaxInvoke", script, true);
}
保護された文字列 GenertorScript(Type タイプ)
{
return string.Empty;
}
protected static void RegisterAjaxInvokeEvent(Type type)
{
var Request = System.Web.HttpContext.Current.Request;
var Response = System.Web.HttpContext.Current.Response;
var メソッド = リクエスト["メソッド"];
if (string.IsNullOrEmpty(メソッド))
return;
Response.Clear();
var methodinfo = type.GetMethod(method, System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
if (methodinfo != null)
{
Response.Charset = ResponseCharset;
Response.ContentType = string.Join(",", Request.AcceptTypes);
var param = methodinfo.GetParameters();
object[] objs = 新しいオブジェクト[param.Length];
var i = 0;
param.ToList().ForEach(t =>
{
objs[i ] = Convert.ChangeType(Request[t.Name], t.ParameterType);
});
var obj = methodinfo.Invoke(null, objs);
if (obj != null)
{
//配列化
if (!obj.GetType().IsValueType && obj.GetType() != typeof(string))
{
if (Request.AcceptTypes.Contains("text/xml"))
{
Response.Write(Green.Utility.SerializerUtility.XmlSerializer(obj));
}
else if (Request.AcceptTypes.Contains("application/json"))
{
Response.ContentType = "application/json, text/javascript, */*";
Response.Write(Green.Utility.SerializerUtility.JsonSerializer(obj));
}
else
{
Response.Write(obj);
}
}
else
{
Response.Write(obj);
}
}
Response.Flush();
Response.Close();
Response.End();
}
}
}
}
リフレクションのパフォーマンスを考慮するために、クラスレベルの登録スクリプトメソッドのキャッシュ処理 jQueryUtilityCache が追加されています。詳細はデモを参照してください。
テスト:
html: