標籤:style blog http color 使用 os io 資料
設計稍微複雜了一點,完成ajax讀取功能涉及到了很多頁面。雖然如此,但感覺比較靈活。
和傳統方法唯一的區別在於多了一層資料容器控制項,裡面提供了顯示資料的HTML元素及相應的JS方法。
這樣資料控制項指產生純資料。
ajax非同步讀取
使用了jQuery.ajax,通過ajax POST方式請求幕後處理ashx頁面,並傳遞相關參數。
ashx
完成動態載入使用者控制項,並根據接收的參數對控制項的屬性進行賦值。
載入控制項,藉助於部落格園老趙的一篇博文,連結找不到了,以後再補。
public class ViewManager<T> where T : System.Web.UI.UserControl { private System.Web.UI.Page m_pageHolder; public T LoadViewControl(string path) { this.m_pageHolder = new System.Web.UI.Page(); return (T)this.m_pageHolder.LoadControl(path); } public string RenderView(T control) { StringWriter output = new StringWriter(); this.m_pageHolder.Controls.Add(control); HttpContext.Current.Server.Execute(this.m_pageHolder, output, false); return output.ToString(); } }
View Code
代碼很少,確很實用。
反射賦值
foreach (System.Reflection.PropertyInfo p in control.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { if (string.IsNullOrEmpty(context.Request[p.Name])) continue; try { Convert.ChangeType(context.Request[p.Name], p.PropertyType); p.SetValue(control, Convert.ChangeType(context.Request[p.Name], p.PropertyType), null); } catch (System.InvalidCastException e) { } }
View Code
具體使用
ViewManager<Web.controls.PageControl> viewManager = new ViewManager<Web.controls.PageControl>();Web.controls.PageControl control = viewManager.LoadViewControl("~/upload/controls/" + name); foreach (System.Reflection.PropertyInfo p in control.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { if (string.IsNullOrEmpty(context.Request[p.Name])) continue; try { Convert.ChangeType(context.Request[p.Name], p.PropertyType); p.SetValue(control, Convert.ChangeType(context.Request[p.Name], p.PropertyType), null); } catch (System.InvalidCastException e) { } } context.Response.Write(viewManager.RenderView(control));
View Code
資料控制項
使用asp:Repeater顯示資料。