using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;namespace Blogging
{
/// <summary>
/// NoFormValButton 的摘要说明。
/// </summary>
public class NoFormValButton:System.Web.UI.WebControls.Button
{
public NoFormValButton()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public string NoFormValList
{
get
{
object o=ViewState["NoFormValList"];
if(o==null)
{
return string.Empty;
}
else
{
return o.ToString();
}
}
set
{
ViewState["NoFormValList"]=value;
}
}

//System.Web.UI.Control类的Render方法:将服务器控件内容发送到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
protected override void Render(HtmlTextWriter output)
{//HttpRequest 类:使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。
System.Web.HttpRequest theRequest=System.Web.HttpContext.Current.Request;
//HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息,该对象提供对请求的内部 Request、Response 和 Server 属性的访问
if(NoFormValList!="")
{//HttpRequest.Browser 属性:获取或设置有关正在请求的客户端的浏览器功能的信息。
if(theRequest.Browser.Browser.ToString()=="IE"&&Convert.ToInt32(theRequest.Browser.MajorVersion)>=4)//获得User-Agent头中传输的浏览器字符串和它的版本号
{
string[] astrList;
string strControl="";                    output.WriteLine("<script language='javascript'>");
                    output.WriteLine("<!--");
                    output.WriteLine("function TurnOffVal"+base.ID+"()");
                    output.WriteLine((char)9+"{");
                    astrList =NoFormValList.Split(',');//截取字符串
// foreach(string strControl in astrList)
// {
// output.WriteLine((char)9+"ValidatorEnable("+strControl+ ", false);");
// }
for(int intLoop=0;intLoop<astrList.GetLowerBound(0);intLoop++)
{
strControl=astrList[intLoop].ToString();
output.WriteLine((char)9+"ValidatorEnable("+strControl+ ", false);");//ValidatorEnable(验证控件名称, false)  该方法可以禁止某个控件使用验证功能
}
                    output.WriteLine((char)9+"}");
                    output.WriteLine("//-->");
                    output.WriteLine("</script>");
                    output.AddAttribute("onServerClick",base.ID+ "_Click");
//RequiredFieldValidator控件的原理,在一个含有RequiredFieldValidator控件的页面上,RequiredFieldValidator控件发送到客户端后生成一些javascript函数,CausesValidation="True"的Button只比CausesValidation="False"的Button多了一句onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); ",即调用相应的javacript代码在客户端验证,
                    output.AddAttribute("onClick", "javascript:TurnOffVal"+base.ID+"(); if (typeof(Page_ClientValidate) == 'function')" + "Page_ClientValidate();");
//HtmlTextWriter.AddAttribute 方法: 对于 HtmlTextWriter 对象通过对 RenderBeginTag 方法的后续调用创建的元素,向其开始标记中添加指定的标记属性和值。 
}
}
base.CausesValidation=false;
base.Render (output);
}
public void DisableServerSideValidation()
{
System.Web.UI.Control ctrlValidator;
string[] astrList; if(NoFormValList!= "")
{
                astrList =NoFormValList.Split(',');
for(int intLoop = 0;intLoop<astrList.GetUpperBound(0);intLoop++)
{
ctrlValidator = Page.FindControl(astrList[intLoop].ToString());
if(ctrlValidator !=null)
{
switch(ctrlValidator.GetType().ToString())
{
case "SYSTEM.WEB.UI.WEBCONTROLS.REGULAREXPRESSIONVALIDATOR":((RegularExpressionValidator)ctrlValidator).IsValid=true;
break;
case "SYSTEM.WEB.UI.WEBCONTROLS.REQUIREDFIELDVALIDATOR":((RequiredFieldValidator)ctrlValidator).IsValid = true;
break;
case "SYSTEM.WEB.UI.WEBCONTROLS.RANGEVALIDATOR":((RangeValidator)ctrlValidator).IsValid = true;
break;
case "SYSTEM.WEB.UI.WEBCONTROLS.COMPAREVALIDATOR":((CompareValidator)ctrlValidator).IsValid = true;
break;
case "SYSTEM.WEB.UI.WEBCONTROLS.CUSTOMVALIDATOR":((CustomValidator)ctrlValidator).IsValid = true;
break;
default:
break;
}
}
}
}
} }
}