当前位置:中国站长下载文章中心网页编程.NET编程 → ASP.NET入门随想之代言人 (2)

ASP.NET入门随想之代言人 (2)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 8:37:50
     ■ 注入 - 动态添加客户端脚本
  
    除了直接在.ASPx文件中显式声明外,Page类还提供了一些方法用于动态创建客户端脚本。所谓的动态生成脚本,实际上就是生成对应的脚本字符串,然后使用Page类提供的ReGISterClientScriptBlock 、RegisterOnSubmitStatement等方法注入到HtmlTextWriter实例中合适的位置,同时,ASP.NET还提供若干方法用于辅助生成脚本,无非就是加点隐藏输入域、数组之类的东西。
  
    控件也可以在OnPreRender方法调用这些方法通知页面添加所需脚本字符串。之所以不在Render方法中实现,是因为HtmlTextWriter实例在被传递到控件手上时,Page类已经完成在HtmlTextWrite实例中生成对应文本,慢了一步。下例为页面回发添加一个确定对话框。
  
  <%@ Page Language="C#" %>
  <script runat="server">
  protected void Page_Load(Object sender, EventArgs e){
   String scriptText = "return confirm('要提交吗?')";
   //添加页面提交时执行的脚本。 RegisterOnSubmitStatement("ConfirmSubmit", scriptText);
  }
  </script>
  <html><head></head><body>
  <form id="form1" runat="server">
  <asp:button id=btnTest text=PostBack runat="server" />
  </form></body></html>
  
    ■ 携手 - GetPostBackEventReference方法
  
    很多时候我们希望客户端行为能够和相应的服务端行为携起手来,共同完成一个完整的系统功能,即客户端行为能够触发相应的服务器端行为,即两者映射。在ASP.net1.1中,本质上是把页面为原子回发单位,客户端行为只能在页面回发之前向隐藏标志域里写入带有自身特征的数据,页面回发后,控件们通过检查隐藏标志域的数据来触发相应的行为。
  
    客户端与服务端携手典型例子有两个:一是GetPostBackEventReference方法,它可以引发带有特征数据的页面回传;一是大名鼎鼎的验证器构架,除此之外,标准控件也有若干是通过客户端行为来实现。下面我们以前者为例,演示完整的"生成-客户端处理-回发-服务端处理"过程。
  
  public class MyControl : Control, IPostBackEventHandler{
   //定义Number属性
   public int Number{
    get{
     if ( ViewState["Number"] !=null )
      return (int) ViewState["Number"];
     else
      return 50;
    }
    set { ViewState["Number"] = value; }
   }
   //依赖于用户操作的事件处理,请参考《随想十一》
   // eventArgument为事件数据,这里由GetPostBackEventReference设置
   public void RaisePostBackEvent(string eventArgument){
    if ( eventArgument == "inc" ) Number ++;
    if ( eventArgument == "dec" ) Number --;
   }
   //生成控件对应的HTML标记文本
   //除生成Number属性文本外,还生成两个引发回发并带着回发事件参数的超链接
   // GetPostBackEventReference 方法发出启动回发的客户端脚本,并提供引用
   protected override void Render(HtmlTextWriter writer){
    writer.Write("控件值:" + Number.ToString() + " " );
    writer.Write("<a href=\"JavaScript:" + Page.GetPostBackEventReference(this,"inc") + "\">+</a>");
    writer.Write(" or ");
    writer.Write("<a href=\"Javascript:" + Page.GetPostBackEventReference(this,"dec") + "\">-</a>");
   }
  }
  
  
   由于ASP.NET1.1是以页面为原子回发单位,代言人与品牌之间的沟通和联系要付出巨大的性能代价。要改善只能打破以页面作为原子回发单位的制度。
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。