2012年(366)
分类: 系统运维
2012-05-08 15:57:47
本篇说明 提到的 ajax 解决方案之五。
首先,请理解什么是 wrapper page。
wrapper page 是定
义的一种专门用来包装用户控件 ascx 的 webform,wrapper page 的 Render 方法被重写(override),仅
render 它的 UserControl 成员。这样,我们就可以通过 ascx 输出干净的 html 片断。是的,我们的目标就是输出干净的 html 片断!
目标明确了,思路有了,现在让我们来实现吧~
很简单:写一个 Wrapper Page Base,作为所有 wrapper page 的基类,以后的 wrapper page 都从它继承。这个类(WrapperPageBasel类)继承自System.Web.UI.Page类,他只要做两件事情:
那么我们在重写的 Render 方法里执行 UserControl 的 Render 方法即可。请看代码1):
///Wrapper Page继承自WrapperPageBase类:
public partial class Ajax_Test : WrapperPageBase { protected void Page_Load(object sender, EventArgs e) { this.control = (UserControl)this.LoadControl("~/Controls/any.ascx"); // 有用的用户控件 } }在页面中,使用jQuery异步调用。参看 的实例。
你的页面只需要一句话:
其余都可以删除。——当然,你也可以不删除,你会发现哪些代码不会出现在页面上。你还可以在同一个 Wrapper Page 里来切换 UserControl,只要判断下query string,像这样:
protected void Page_Load(object sender, EventArgs e) { var str = Request["Want"]; if(str == "IWantA") this.control = (UserControl)this.LoadControl("~/Controls/A.ascx"); // 用户控件A else if(str == "IWantB") this.control = (UserControl)this.LoadControl("~/Controls/B.ascx"); // 用户控件A else this.control = (UserControl)this.LoadControl("~/Controls/WhatDoYouWant.ascx"); // 用户控件WhatDoYouWant }至此,这个解决方案就完成了。
事实上,我们不用 WrapperPageBase,不用重写 Render 方法,简单地把 webform 里的 html 代码全部删掉,再换上我们现在放在 ascx 里的代码,这样也可以达到输出 html 片断的效果。但是为什么要这么麻烦????
理由如下: