在.net  web應用程序開發中, 我們希望用戶在做一個重要的操作時, 能夠詢問或警告用戶.  或者希望我們有這么一個簡單實用的控件, 能在用戶確定后引發一個服務端的事件.
這個控件的原理很簡單,主要是實現ipostbackeventhandler接口和調用page.getpostbackeventreference(this, eventargument),  實現對客戶端__dopostback方法的調用, 引發服務端的事件
而以下這段關鍵代碼是實現功能的核心:
    if(alertstring != "") //僅在用戶確認后調用客戶端的__dostpostback, 引發服務端事件
    {
     action = "javascript:if(window.confirm(/'"  + alertstring + "')==true){";
     action += page.getpostbackeventreference(this, "click");
     action += ";}";
    }
全部代碼:
using system;
using system.web.ui;
using system.web.ui.webcontrols;
using system.componentmodel;
namespace booksir.webcontrols
{
 /// <summary>
 /// alertbutton 的摘要說明。
 /// </summary>
 [
 defaultproperty("text"), 
 toolboxdata("<{0}:alertbutton runat=server></{0}:alertbutton>"),
 system.componentmodel.defaultevent("click"),
 ]
 public class alertbutton : system.web.ui.webcontrols.webcontrol, ipostbackeventhandler
 {
  private viewstatebag statebag;
  public alertbutton()
  {
   statebag = new viewstatebag(this.viewstate);
  }
  public event eventhandler click; //事件句柄
  public enum appearanceenum
  {
   button,
   imagebutton,
  }
  /// <summary>
  /// 按鈕的外觀模式
  /// </summary>
  [
  bindable(false),
  category("appearance"), 
  defaultvalue(appearanceenum.button),
  description("按鈕的外觀模式"),
  ]
  public appearanceenum appearance
  {
   get
   {
    object obj;
    obj = viewstate["appearance"];
    if(obj == null)
    {
     appearance = appearanceenum.button;
     return appearanceenum.button;
    }
    return (appearanceenum)obj;
   }
   set
   {
    viewstate["appearance"] = value;
   }
  }
  /// <summary>
  /// 在defaultvalue為非常量值的情況下,可以用reset...來重置屬性的默認值
  /// </summary>
  void resetappearance()
  {
   appearance = appearanceenum.button;
  }
  /// <summary>
  /// 該方法的存在使系統在屬性為默認值不提交屬性賦值代碼
  /// </summary>
  /// <returns></returns>
  bool shouldserializeappearance()
  {
   return appearance != appearanceenum.button;
  }
  [
  bindable(true), 
  category("appearance"), 
  defaultvalue("")
  ] 
  public string text 
  {
   get
   {
    return statebag.getstring("text", this.id);
   }
   set
   {
    viewstate["text"] = value;
   }
  }
  /// <summary>
  /// 在執行動作前的提示
  /// </summary>
  [
  bindable(true), 
  category("appearance"), 
  defaultvalue(""),
  description("在執行動作前的提示"),
  ] 
  public string alertstring
  {
   get
   {
    return statebag.getstring("alertstring", "是否開始執行?");
   }
   set
   {
    viewstate["alertstring"] = value;
   }
  }
  /// <summary>
  /// 按鈕可用時的image
  /// </summary>
  [
  description("按鈕可用時的image"),
  category("appearance"), 
  editor(typeof(system.web.ui.design.urleditor), typeof(system.drawing.design.uitypeeditor)),
  ]
  public string enabledimage
  {
   get
   {
    return statebag.getstring("enabledimage", "");
   }
   set
   {
    viewstate["enabledimage"] = value;
   }
  }
  /// <summary>
  /// 按鈕不可用時的image
  /// </summary>
  [
  description("按鈕不可用時的image"),
  category("appearance"), 
  editor(typeof(system.web.ui.design.urleditor), typeof(system.drawing.design.uitypeeditor)),
  ]
  public string disabledimage
  {
   get
   {
    return statebag.getstring("disabledimage", "");
   }
   set
   {
    viewstate["disabledimage"] = value;
   }
  }
  /// <summary> 
  /// 將此控件呈現給指定的輸出參數。
  /// </summary>
  /// <param name="output"> 要寫出到的 html 編寫器 </param>
  protected override void render(htmltextwriter output)
  {
   if(appearance == appearanceenum.button)
    output.write(getbuttonhtml());
   else
    output.write(getimagebuttonhtml());
  }
  /// <summary>
  /// 獲取呈現button時的html
  /// </summary>
  /// <returns></returns>
  private string getbuttonhtml()
  {
   const string buttontag = "<input type=button value='{0}' onclick=/"{1}/" style=/"{2}/"{3} title='{4}'>";
   string shtml;
   string action;
   string style = "width:{0};height:{1};";
   if(alertstring != "")
   {
    action = "javascript:if(window.confirm(/'"  + alertstring + "')==true){";
    action += page.getpostbackeventreference(this, "click");
    action += ";}";
   }
   else
    action = "javascript:" + page.getpostbackeventreference(this, "click");
   style = string.format
    (
    style,
    this.width.tostring(),
    this.height.tostring()
    );
   style += this.attributes["style"];
   shtml = string.format
    (
    buttontag, 
    text, 
    action,
    style,
    enabled ? "" : " disabled",
    this.tooltip
    );
   return shtml;
  }
  /// <summary>
  /// 獲取呈現imagebutton時的html
  /// </summary>
  /// <returns></returns>
  private string getimagebuttonhtml()
  {
   const string linktag = "<a onclick=/"{0}/" title='{1}' style=/"{2}/">{3}</a>";
   const string imgtag = "<img src='{0}' border=0>";
   string shtml;
   string action;
   string image;
   string style;
   if(this.enabled)
   {
    if(alertstring != "") //僅在用戶確認后調用客戶端的__dostpostback, 引發服務端事件
    {
     action = "javascript:if(window.confirm(/'"  + alertstring + "')==true){";
     action += page.getpostbackeventreference(this, "click");
     action += ";}";
    }
    else
     action = "javascript:" + page.getpostbackeventreference(this, "click");
    if(enabledimage != "")
     image = string.format(imgtag, enabledimage);
    else
     image = text;
   }
   else
   {
    action = "javascript:void()";
    if(disabledimage != "")
     image = string.format(imgtag, disabledimage);
    else
     image = text;
   }
   style = "cursor:hand;";
   style += this.attributes["style"];
   shtml = string.format
    (
    linktag,
    action,
    this.tooltip,
    style,
    image
    );
   return shtml;
  }
  protected virtual void onclick()
  {
   if(click != null)
    click(this, eventargs.empty);
  }
  public void raisepostbackevent(string eventargument)
  {
   if(eventargument == "click")
    onclick();
  }
 }
}
好了, 到此結束, 將以上代碼編譯為dll, 并加入為控件吧, 試試看, 是不是簡單實用呢?
網站運營seo文章大全提供全面的站長運營經驗及seo技術!