|
2006年12月16日
#
XML文件: <Persons> <Person id="1"> <Name>李一</Name> <Sex>男</Sex> </Person> <Person id="2"> <Name>李二</Name> <Sex>女</Sex> </Person> <Person id="3"> <Name>李三</Name> <Sex>男</Sex> </Person> <Person id="4"> <Name>陈四</Name> <Sex>男</Sex> </Person> <Person id="5"> <Name>李四</Name> <Sex>女</Sex> </Person> </Persons>
现在,我希望针对“姓名”做一个模糊查询,在用户输入:“李”的时候,将姓李的资料全部显示出来,请高手帮忙指点,最好有源代码,谢谢了!
解决方法一:System.Xml.XmlDocument x = new System.Xml.XmlDocument(); x.Load(Server.MapPath("x1.xml")); System.Xml.XmlNodeList nodes = x.SelectNodes("//Name"); foreach(System.Xml.XmlNode y in nodes) { if(y.InnerText.IndexOf("李") >-1) Response.Write(y.InnerText); } 解决方法2:System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load("file:///d:/test.xml");
foreach (System.Xml.XmlNode n in doc.DocumentElement.SelectNodes("Person[contains(Name,'李')]")) { MessageBox.Show(n.InnerXml); }
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=131759
<?xml version="1.0" encoding="utf-8"?> <userdata createuser="false"> <dataconnection> <server>localhost</server> <uid>sa</uid> <pwd></pwd> </dataconnection> <net> <name>jiayuan</name> </net> </userdata>
读取节点中的一个属性 XmlDocument doc=new XmlDocument(); doc.Load("config.xml"); XmlNode xnuser=doc.SelectSingleNode("userdata"); string flag=xnuser.Attributes["createuser"].InnerText;
读取节点中的值 XmlDocument doc=new XmlDocument(); doc.Load("config.xml"); XmlNode xnserver = doc.SelectSingleNode("userdata/dataconnection/server");
修改节点的属性 XmlDocument doc=new XmlDocument(); doc.Load("config.xml"); XmlNode xnuser=doc.SelectSingleNode("userdata"); xnuser.Attributes["createuser"].InnerText="false"; doc.Save("config.xml");
追加节点 XmlDocument doc = new XmlDocument(); XmlTextReader reader = new XmlTextReader("config.xml"); doc.Load("config.xml"); XmlElement root = doc.DocumentElement; // 获取根节点 XmlElement tagMessage = doc.CreateElement("net"); XmlElement tagText = doc.CreateElement("name"); tagText.InnerText = netname; tagMessage.AppendChild(tagText); // 追加到 xml 文本的最后面 root.AppendChild(tagMessage); reader.Close(); // 关闭 XmlTextReader doc.Save("config.xml"); // 保存 xml 文件
2006年12月1日
#
http://zzc1981.spaces.live.com/
关键字:正则表达式 模式匹配 Javascript
摘要:收集一些常用的正则表达式。
正则表达式用于字符串处理,表单验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。我将一些常用的表达式收藏在这里,作备忘之用。本贴随时会更新。
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:
String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }
利用正则表达式分解和转换IP地址:
下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:
function IP2V(ip) { re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 if(re.test(ip)) { return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 } else { throw new Error("Not a valid IP address!") } }
不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:
var ip="10.100.20.168" ip=ip.split(".") alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]
var s="abacabefgeeii" var s1=s.replace(/(.).*\1/g,"$1") var re=new RegExp("["+s1+"]","g") var s2=s.replace(re,"") alert(s1+s2) //结果为:abcefgi
我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。
得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1
s="http://www.9499.net/page1.htm" s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2") alert(s)
利用正则表达式限制网页表单里的文本框输入内容:
用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
正则表达式,相关链接 http://blog.csdn.net/laily/category/19548.aspx http://blog.csdn.net/laily/archive/2004/06/30/30525.aspx 微软的正则表达式教程(五):选择/编组和后向引用
http://blog.csdn.net/laily/archive/2004/06/30/30522.aspx 微软的正则表达式教程(四):限定符和定位符
http://blog.csdn.net/laily/archive/2004/06/30/30517.aspx 微软的正则表达式教程(三):字符匹配
http://blog.csdn.net/laily/archive/2004/06/30/30514.aspx 微软的正则表达式教程(二):正则表达式语法和优先权顺序
http://blog.csdn.net/laily/archive/2004/06/30/30511.aspx 微软的正则表达式教程(一):正则表达式简介
http://blog.csdn.net/laily/archive/2004/06/30/30360.aspx 小程序大作为:高级查找/替换、正则表达式练习器、Javascript脚本程序调试器
http://blog.csdn.net/laily/archive/2004/06/24/25872.aspx 经典正则表达式
正则表达式,正规表达式,正则表达式匹配,正则表达式语法,模式匹配,正规表达式匹配 javascript正则表达式 ASP正则表达式 ASP.NET正则表达式 C#正则表达式 JSP正则表达式 PHP正则表达式 VB.NET正则表达式 VBSCript正则表达式编程 delphi正则表达式 jscript
正则表达式 regular expression 正则表达式 RegExp 模式 pattern 匹配 Match .NET命名空间: System.Text.RegularExpression
补充: ^\d+$ //匹配非负整数(正整数 + 0) ^[0-9]*[1-9][0-9]*$ //匹配正整数 ^((-\d+)|(0+))$ //匹配非正整数(负整数 + 0) ^-[0-9]*[1-9][0-9]*$ //匹配负整数 ^-?\d+$ //匹配整数 ^\d+(\.\d+)?$ //匹配非负浮点数(正浮点数 + 0) ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮点数 ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ //匹配非正浮点数(负浮点数 + 0) ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配负浮点数 ^(-?\d+)(\.\d+)?$ //匹配浮点数 ^[A-Za-z]+$ //匹配由26个英文字母组成的字符串 ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串 ^[a-z]+$ //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串 ^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串 ^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ //匹配email地址 ^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ //匹配url
利用正则表达式去除字串中重复的字符的算法程序:
var s="abacabefgeeii" var s1=s.replace(/(.).*\1/g,"$1") var re=new RegExp("["+s1+"]","g") var s2=s.replace(re,"") alert(s1+s2) //结果为:abcefgi =============================== 如果var s = "abacabefggeeii" 结果就不对了,结果为:abeicfgg 正则表达式的能力有限
1.确认有效电子邮件格式 下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前,筛选出包含无效字符的电子邮件地址。
[Visual Basic] Function IsValidEmail(strIn As String) As Boolean ' Return true if strIn is in valid e-mail format. Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$") End Function [C#] bool IsValidEmail(string strIn) { // Return true if strIn is in valid e-mail format. return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); }
2.清理输入字符串 下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。
[Visual Basic] Function CleanInput(strIn As String) As String ' Replace invalid characters with empty strings. Return Regex.Replace(strIn, "[^\w\.@-]", "") End Function [C#] String CleanInput(string strIn) { // Replace invalid characters with empty strings. return Regex.Replace(strIn, @"[^\w\.@-]", ""); }
3.更改日期格式 以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。
[Visual Basic] Function MDYToDMY(input As String) As String Return Regex.Replace(input, _ "\b(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2,4})\b", _ "${day}-${month}-${year}") End Function [C#] String MDYToDMY(String input) { return Regex.Replace(input, "\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b", "${day}-${month}-${year}"); } Regex 替换模式 本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${day} 插入由 (?<day>...) 组捕获的子字符串。
有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便
4.提取 URL 信息 以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如,“http://www.contoso.com:8080/letters/readme.html”将返回“http:8080”。
[Visual Basic] Function Extension(url As String) As String Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", _ RegexOptions.Compiled) Return r.Match(url).Result("${proto}${port}") End Function [C#] String Extension(String url) { Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", RegexOptions.Compiled); return r.Match(url).Result("${proto}${port}"); }
一、正则表达式基础知识 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说:
1.1句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符??句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“tn”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:
1.2方括号符号 为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:
1.4表示匹配次数的符号 表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:
假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。
图一:匹配所有123-12-1234形式的社会安全号码 假设进行搜索的时候,你希望连字符号可以出现,也可以不出现??即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:
图二:匹配所有123-12-1234和123121234形式的社会安全号码 下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{ 4}”,再加上字母部分“[A-Z]{ 2}”。图三显示了完整的正则表达式。
图三:匹配典型的美国汽车牌照号码,如8836KV 1.5“否”符号 “^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。
图四:匹配所有单词,但“X”开头的除外 1.6圆括号和空白符号 假设要从格式为“June26,1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:
图五:匹配所有MothDD,YYYY格式的日期 新出现的“\s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用OROAPI(本文后面详细讨论)提取出它的值。修改后的正则表达式如图六所示:
图六:匹配所有MonthDD,YYYY格式的日期,定义月份值为第一个组 1.7其它符号 为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如表二所示: 表二:常用符号
例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“\d”。修改后的正则表达式如图七所示:

/*------------------------ 功能:替换任何空白字符 -------------------------*/ function TrimString (strVal) { strTmp = strVal + ""; if (strTmp.length == 0) return (strTmp); reVal = /^\s*/; strTmp = strTmp.replace (reVal, ''); reVal = /\s*$/; return (strTmp.replace (reVal, '')); }
/*------------------------ 功能:检测是否是有效数字 -------------------------*/ function Check_Num( num ) { num = ( TrimString( num ) ); if (num.length == 0) return (false); return ( Number( num ) ); }
/*------------------------ 功能:检测是否是有效日期 -------------------------*/ function Check_Date (strDate) { strDate = (TrimString (strDate)); if (strDate.length == 0) return (false); reVal = /^([1-2]\d{3})[\/|\-](0?[1-9]|10|11|12)[\/|\-]([1-2]?[0-9]|0[1-9]|30|31)$/; return (reVal.test (strDate)); }
/*------------------------ 功能:检测是否是有效Email -------------------------*/ function Check_Email (strEmail) { strEmail = (TrimString (strEmail)); if (strEmail.length == 0) return (false);
reVal = /^[\-!#\$%&'\*\+\\\.\/0-9=\?A-Z\^_`a-z{|}~]+@[\-!#\$%&'\*\+\\\.\/0-9=\?A-Z\^_`a-z{|}~]+(\.[\-!#\$%&'\*\+\\\.\/0-9=\?A-Z\^_`a-z{|}~]+)+$/; return (reVal.test (strEmail)); }
/*------------------------ 功能:检测是否是有效时间 -------------------------*/ function Check_Time (strTime) { strTime = (TrimString (strTime)); if (strTime.length == 0) return (false);
reVal = /^(([0-9]|[01][0-9]|2[0-3])(:([0-9]|[0-5][0-9])){0,2}|(0?[0-9]|1[0-1])(:([0-9]|[0-5][0-9])){0,2}\s?[aApP][mM])?$/; return (reVal.test (strTime)); }
/*------------------------ 功能:检测是否是有效日期特定格式 -------------------------*/ function Check_Date_1 (strDate) { strDate = (TrimString (strDate)); if (strDate.length == 0) return (false); reVal = /^([1-2]\d{3})[\/](0?[1-9]|10|11|12)[\/]([1-2]?[0-9]|0[1-9]|30|31)$/; return (reVal.test (strDate)); }
/*------------------------ 功能:检测是否是有效日期特定格式 -------------------------*/ function Check_Date_2 (strDate) { strDate = (TrimString (strDate)); if (strDate.length == 0) return (false); reVal = /^([1-2]\d{3})[\-](0[1-9]|10|11|12)[\-]([1-2][0-9]|0[1-9]|30|31)$/; return (reVal.test (strDate)); }
/*-------------------------------------- 功能:换行定行 ---------------------------------------*/ function enter( form, temp ) { if ( window.event.keyCode == 13 ) { eval( form + temp + ".focus()" ); eval( form + temp + ".select()" ); } else return (false); }
/*-------------------------------------- 功能:检查字符串长度 ---------------------------------------*/ function ByteString (strVal) { nLen = 0;
for (i = 0; i < strVal.length; i ++) { if (strVal.charCodeAt (i) > 255) nLen += 2; else nLen ++; }; return (nLen); }
/*-------------------------------------- 功能:按要求截取字符串长度 ---------------------------------------*/ function SubString(strVal,nStrLen) { nLen = 0; nTemp = 0; for (i = 0; i < strVal.length; i ++) { if (strVal.charCodeAt (i) > 255) nLen += 2; else nLen ++; if(nLen <= nStrLen) nTemp = i; else break; }; return(strVal.substr(0,nTemp+1)); }
/*------------------------ 功能:检测密码,密码只能由英文字母、数字、减号、下划线、$、#、*、(和)构成,且首位必须是英文字母 -------------------------*/ function Check_Pass( strPass ) { strPass = ( TrimString( strPass ) ); if (strPass.length == 0) return (false); reVal = /^[a-zA-Z]{1}[a-zA-Z0-9-_$#*()]{0,29}$/; return ( reVal.test (strPass) ); }
这是所有的,不过是PHP的,你自己转换一下吧~~
# re: 正则表达式 2005-02-28 00:59 yongsheng
^(((19)|(20))\d{2})(((((-|/)0?)|0)[1-9])|((-|/)?1[0-2]))((((((-|/)0?)|0)[1-9])|((-|/)?[1-2][0-9]))|((-|/)?3[0-1]))$
2004-1-1格式
# re: 正则表达式 2005-03-07 14:33 yongsheng
一、验证类 1、数字验证内 1.1 整数 1.2 大于0的整数 (用于传来的ID的验证) 1.3 负整数的验证 1.4 整数不能大于iMax 1.5 整数不能小于iMin 2、时间类 2.1 短时间,形如 (13:04:06) 2.2 短日期,形如 (2003-12-05) 2.3 长时间,形如 (2003-12-05 13:04:06) 2.4 只有年和月。形如(2003-05,或者2003-5) 2.5 只有小时和分钟,形如(12:03) 3、表单类 3.1 所有的表单的值都不能为空 3.2 多行文本框的值不能为空。 3.3 多行文本框的值不能超过sMaxStrleng 3.4 多行文本框的值不能少于sMixStrleng 3.5 判断单选框是否选择。 3.6 判断复选框是否选择. 3.7 复选框的全选,多选,全不选,反选 3.8 文件上传过程中判断文件类型 4、字符类 4.1 判断字符全部由a-Z或者是A-Z的字字母组成 4.2 判断字符由字母和数字组成。 4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母 4.4 字符串替换函数.Replace(); 5、浏览器类 5.1 判断浏览器的类型 5.2 判断ie的版本 5.3 判断客户端的分辨率
6、结合类 6.1 email的判断。 6.2 手机号码的验证 6.3 身份证的验证
二、功能类
1、时间与相关控件类 1.1 日历 1.2 时间控件 1.3 万年历 1.4 显示动态显示时钟效果(文本,如OA中时间) 1.5 显示动态显示时钟效果 (图像,像手表) 2、表单类 2.1 自动生成表单 2.2 动态添加,修改,删除下拉框中的元素 2.3 可以输入内容的下拉框 2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)
3、打印类 3.1 打印控件 4、事件类 4.1 屏蔽右键 4.2 屏蔽所有功能键 4.3 --> 和<-- F5 F11,F9,F1 4.4 屏蔽组合键ctrl+N 5、网页设计类 5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现) 5.2 html编辑控件类 5.3 颜色选取框控件 5.4 下拉菜单 5.5 两层或多层次的下拉菜单 5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目) 5.7 状态栏,title栏的动态效果(例子很多,可以研究一下) 5.8 双击后,网页自动滚屏 6、树型结构。 6.1 asp+SQL版 6.2 asp+xml+sql版 6.3 java+sql或者java+sql+xml 7、无边框效果的制作 8、连动下拉框技术 9、文本排序
一、验证类 1、数字验证内 1.1 整数 /^(-|\+)?\d+$/.test(str) 1.2 大于0的整数 (用于传来的ID的验证) /^\d+$/.test(str) 1.3 负整数的验证 /^-\d+$/.test(str) 2、时间类 2.1 短时间,形如 (13:04:06) function isTime(str) { var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/); if (a == null) {alert('输入的参数不是时间格式'); return false;} if (a[1]>24 || a[3]>60 || a[4]>60) { alert("时间格式不对"); return false } return true; } 2.2 短日期,形如 (2003-12-05) function strDateTime(str) { var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); if(r==null)return false; var d= new Date(r[1], r[3]-1, r[4]); return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]); } 2.3 长时间,形如 (2003-12-05 13:04:06) function strDateTime(str) { var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; var r = str.match(reg); if(r==null)return false; var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]); } 2.4 只有年和月。形如(2003-05,或者2003-5) 2.5 只有小时和分钟,形如(12:03) 3、表单类 3.1 所有的表单的值都不能为空 <input onblur="if(this.value.replace(/^\s+|\s+$/g,'')=='')alert('不能为空!')"> 3.2 多行文本框的值不能为空。 3.3 多行文本框的值不能超过sMaxStrleng 3.4 多行文本框的值不能少于sMixStrleng 3.5 判断单选框是否选择。 3.6 判断复选框是否选择. 3.7 复选框的全选,多选,全不选,反选 3.8 文件上传过程中判断文件类型 4、字符类 4.1 判断字符全部由a-Z或者是A-Z的字字母组成 <input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有错')"> 4.2 判断字符由字母和数字组成。 <input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有错')"> 4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母 /^([a-zA-z_]{1})([\w]*)$/g.test(str) 4.4 字符串替换函数.Replace(); 5、浏览器类 5.1 判断浏览器的类型 window.navigator.appName 5.2 判断ie的版本 window.navigator.appVersion 5.3 判断客户端的分辨率 window.screen.height; window.screen.width;
6、结合类 6.1 email的判断。 function ismail(mail) { return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(mail)); } 6.2 手机号码的验证 6.3 身份证的验证 function isIdCardNo(num) { if (isNaN(num)) {alert("输入的不是数字!"); return false;} var len = num.length, re; if (len == 15) re = new RegExp(/^(\d{6})()?(\d{2})(\d{2})(\d{2})(\d{3})$/); else if (len == 18) re = new RegExp(/^(\d{6})()?(\d{4})(\d{2})(\d{2})(\d{3})(\d)$/); else {alert("输入的数字位数不对!"); return false;} var a = num.match(re); if (a != null) { if (len==15) { var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]); var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5]; } else { var D = new Date(a[3]+"/"+a[4]+"/"+a[5]); var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5]; } if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;} } return true; }
3.7 复选框的全选,多选,全不选,反选 <form name=hrong> <input type=checkbox name=All onclick="checkAll('mm')">全选<br/> <input type=checkbox name=mm onclick="checkItem('All')"><br/> <input type=checkbox name=mm onclick="checkItem('All')"><br/> <input type=checkbox name=mm onclick="checkItem('All')"><br/> <input type=checkbox name=mm onclick="checkItem('All')"><br/> <input type=checkbox name=mm onclick="checkItem('All')"><br/><br/>
<input type=checkbox name=All2 onclick="checkAll('mm2')">全选<br/> <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/> <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/> <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/> <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/> <input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
</form>
<SCRIPT LANGUAGE="JavaScript"> function checkAll(str) { var a = document.getElementsByName(str); var n = a.length; for (var i=0; i<n; i++) a[i].checked = window.event.srcElement.checked; } function checkItem(str) { var e = window.event.srcElement; var all = eval("document.hrong."+ str); if (e.checked) { var a = document.getElementsByName(e.name); all.checked = true; for (var i=0; i<a.length; i++) { if (!a[i].checked){ all.checked = false; break;} } } else all.checked = false; } </SCRIPT>
3.8 文件上传过程中判断文件类型 <input type=file onchange="alert(this.value.match(/^(.*)(\.)(.{1,8})$/)[3])">
画图: <OBJECT id=S style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px" height=240 width=392 classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6"> </OBJECT> <SCRIPT> S.DrawingSurface.ArcDegrees(0,0,0,30,50,60); S.DrawingSurface.ArcRadians(30,0,0,30,50,60); S.DrawingSurface.Line(10,10,100,100); </SCRIPT>
写注册表: <SCRIPT> var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\", 1, "REG_BINARY"); WshShell.RegWrite ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader", "Goocher!", "REG_SZ"); var bKey = WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\"); WScript.Echo (WshShell.RegRead ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader")); WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\MindReader"); WshShell.RegDelete ("HKCU\\Software\\ACME\\FortuneTeller\\"); WshShell.RegDelete ("HKCU\\Software\\ACME\\"); </SCRIPT>
TABLAE相关(客户端动态增加行列) <HTML> <SCRIPT LANGUAGE="JScript"> function numberCells() { var count=0; for (i=0; i < document.all.mytable.rows.length; i++) { for (j=0; j < document.all.mytable.rows(i).cells.length; j++) { document.all.mytable.rows(i).cells(j).innerText = count; count++; } } } </SCRIPT> <BODY onload="numberCells()"> <TABLE id=mytable border=1> <TR><TH> </TH><TH> </TH><TH> </TH><TH> </TH></TR> <TR><TD> </TD><TD> </TD><TD> </TD><TD> </TD></TR> <TR><TD> </TD><TD> </TD><TD> </TD><TD> </TD></TR> </TABLE> </BODY> </HTML>
1.身份证严格验证:
<script> var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}
function cidInfo(sId){ var iSum=0 var info="" if(!/^\d{17}(\d|x)$/i.test(sId))return false; sId=sId.replace(/x$/i,"a"); if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区"; sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2)); var d=new Date(sBirthday.replace(/-/g,"/")) if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日"; for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) if(iSum%11!=1)return "Error:非法证号"; return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女") }
document.write(cidInfo("380524198002300016"),"<br/>"); document.write(cidInfo("340524198002300019"),"<br/>") document.write(cidInfo("340524197711111111"),"<br/>") document.write(cidInfo("34052419800101001x"),"<br/>"); </script>
2.验证IP地址 <SCRIPT LANGUAGE="JavaScript"> function isip(s){ var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}}; var re=s.split(".") return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false }
var s="202.197.78.129"; alert(isip(s)) </SCRIPT>
3.加sp1后还能用的无边框窗口!! <HTML XMLNS:IE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <IE:Download ID="include" STYLE="behavior:url(#default#download)" /> <title>Chromeless Window</title>
<SCRIPT LANGUAGE="JScript"> /*--- Special Thanks For andot ---*/
/* This following code are designed and writen by Windy_sk <seasonx@163.net> You can use it freely, but u must held all the copyright items! */
/*--- Thanks For andot Again ---*/
var CW_width = 400; var CW_height = 300; var CW_top = 100; var CW_left = 100; var CW_url = "/"; var New_CW = window.createPopup(); var CW_Body = New_CW.document.body; var content = ""; var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";
//Build Window include.startDownload(CW_url, function(source){content=source});
function insert_content(){ var temp = ""; CW_Body.style.overflow = "hidden"; CW_Body.style.backgroundColor = "white"; CW_Body.style.border = "solid black 1px"; content = content.replace(/<a ([^>]*)>/g,"<a onclick='parent.open(this.href);return false' $1>"); temp += "<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>"; temp += "<tr style=';font-size:12px;background:#0099CC;height:20;cursor:default' ondblclick=\"Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\" onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'>"; temp += "<td style='color:#ffffff;padding-left:5px'>Chromeless Window For IE6 SP1</td>"; temp += "<td style='color:#ffffff;padding-right:5px;' align=right>"; temp += "<span id=Help onclick=\"alert('Chromeless Window For IE6 SP1 - Ver 1.0\\n\\nCode By Windy_sk\\n\\nSpecial Thanks For andot')\" style=\""+CSStext+"font-family:System;padding-right:2px;\">?</span>"; temp += "<span id=Min onclick='parent.New_CW.hide();parent.blur()' style=\""+CSStext+"font-family:Webdings;\" title='Minimum'>0</span>"; temp += "<span id=Max onclick=\"this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();\" style=\""+CSStext+"font-family:Webdings;\" title='Maximum'>1</span>"; temp += "<span id=Close onclick='parent.opener=null;parent.close()' style=\""+CSStext+"font-family:System;padding-right:2px;\" title='Close'>x</span>"; temp += "</td></tr><tr><td colspan=2>"; temp += "<div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:"+CW_width+"'>"; temp += content; temp += "</div>"; temp += "</td></tr></table>"; CW_Body.innerHTML = temp; }
setTimeout("insert_content()",1000);
var if_max = true; function show_CW(){ window.moveTo(10000, 10000); if(if_max){ New_CW.show(CW_top, CW_left, CW_width, CW_height); if(typeof(New_CW.document.all.include)!="undefined"){ New_CW.document.all.include.style.width = CW_width; New_CW.document.all.Max.innerText = "1"; }
}else{ New_CW.show(0, 0, screen.width, screen.height); New_CW.document.all.include.style.width = screen.width; } }
window.onfocus = show_CW; window.onresize = show_CW;
// Move Window var drag_x,drag_y,draging=false
function drag_move(e){ if (draging){ New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height); return false; } }
function drag_down(e){ if(e.button==2)return; if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return; drag_x=e.clientX; drag_y=e.clientY; draging=true; e.srcElement.setCapture(); }
function drag_up(e){ draging=false; e.srcElement.releaseCapture(); if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return; CW_top = e.screenX-drag_x; CW_left = e.screenY-drag_y; }
</SCRIPT> </HTML>
电话号码的验证
要求: (1)电话号码由数字、"("、")"和"-"构成 (2)电话号码为3到8位 (3)如果电话号码中包含有区号,那么区号为三位或四位 (4)区号用"("、")"或"-"和其他部分隔开 (5)移动电话号码为11或12位,如果为12位,那么第一位为0 (6)11位移动电话号码的第一位和第二位为"13" (7)12位移动电话号码的第二位和第三位为"13" 根据这几条规则,可以与出以下正则表达式: (^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)
<script language="javascript"> function PhoneCheck(s) { var str=s; var reg=/(^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/ alert(reg.test(str)); } </script> <input type=text name="iphone"> <input type=button onclick="PhoneCheck(document.all.iphone.value)" value="Check">
具有在输入非数字字符不回显的效果,即对非数字字符的输入不作反应。 function numbersonly(field,event){ var key,keychar; if(window.event){ key = window.event.keyCode; } else if (event){ key = event.which; } else{ return true } keychar = String.fromCharCode(key); if((key == null)||(key == 0)||(key == 8)||(key == 9)||(key == 13)||(key == 27)){ return true; } else if(("0123456789.").indexOf(keychar)>-1){ window.status = ""; return true; } else { window.status = "Field excepts numbers only"; return false; } }
验证ip
str=document.RegExpDemo.txtIP.value; if(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(str)==false) { window.alert('错误的IP地址格式'); document.RegExpDemo.txtIP.select(); document.RegExpDemo.txtIP.focus(); return; } if(RegExp.$1<1 || RegExp.$1>254||RegExp.$2<0||RegExp.$2>254||RegExp.$3<0||RegExp.$3>254||RegExp.$4<1||RegExp.$4>254) { window.alert('错误的IP地址'); document.RegExpDemo.txtIP.select(); document.RegExpDemo.txtIP.focus(); return; } //剔除 如 010.020.020.03 前面 的0 var str=str.replace(/0(\d)/g,"$1"); str=str.replace(/0(\d)/g,"$1"); window.alert(str);
//一下是取数据的类 //Obj参数指定数据的来源(限定Table),默认第一行为字段名称行 //GetTableData类提供MoveNext方法,参数是表的行向上或向下移动的位数,正数向下移动,负数向上. //GetFieldData方法获得指定的列名的数据 //Sort_desc方法对指定的列按降序排列 //Sort_asc方法对指定的列按升序排列 //GetData方法返回字段值为特定值的数据数组,提供数据,可以在外部进行其他处理 //Delete方法删除当前记录,数组减少一行 //初始化,Obj:table的名字,Leftlen:左面多余数据长度,Rightlen:右面多余数据长度, function GetTableData(Obj,LeftLen,RightLen){ var MyObj=document.all(Obj); var iRow=MyObj.rows.length; var iLen=MyObj.rows[0].cells.length; var i,j;
TableData=new Array(); for (i=0;i< iRow;i++){ TableData[i]=new Array(); for (j=0;j<iLen;j++){ TableStr=MyObj.rows(i).cells(j).innerText; TableStr=TableStr.substring(LeftLen, TableStr.length-RightLen).Trim(); TableStr=TableStr.replace(/ /gi,"").replace(/\r\n/ig,""); TableData[i][j]=TableStr; } }
this.TableData=TableData; this.cols=this.TableData[0].length; this.rows=this.TableData.length; this.rowindex=0; }
function movenext(Step){ if (this.rowindex>=this.rows){ return }
if (Step=="" || typeof(Step)=="undefined") { if (this.rowindex<this.rows-1) this.rowindex++; return;
} else{ if (this.rowindex + Step<=this.rows-1 && this.rowindex + Step>=0 ){ this.rowindex=this.rowindex + Step; } else { if (this.rowindex + Step<0){ this.rowindex= 0; return; } if (this.rowindex + Step>this.rows-1){ this.rowindex= this.rows-1; return; } } } }
function getfielddata(Field){ var colindex=-1; var i=0; if (typeof(Field) == "number"){ colindex=Field; } else { for (i=0;i<this.cols && this.rowindex<this.rows ;i++){ if (this.TableData[0][i]==Field){ colindex=i; break; } } } if (colindex!=-1) { return this.TableData[this.rowindex][colindex]; }
}
function sort_desc(){//降序 var colindex=-1; var highindex=-1; desc_array=new Array(); var i,j; for (n=0; n<arguments.length; n++){ Field=arguments[arguments.length-1-n]; for (i=0;i<this.cols;i++){ if (this.TableData[0][i]==Field){ colindex=i; break; } } if ( colindex==-1 ) return; else { desc_array[0]=this.TableData[0]; for(i=1;i<this.rows;i++){ desc_array[i]=this.TableData[1]; highindex=1; for(j=1;j<this.TableData.length;j++){ if (desc_array[i][colindex]<this.TableData[j][colindex]){ desc_array[i]=this.TableData[j]; highindex=j; }
} if (highindex!=-1) this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length)); } }
this.TableData=desc_array; } return; }
function sort_asc(){//升序 var colindex=-1; var highindex=-1; var i,j; for (n=0; n<arguments.length; n++){ asc_array=new Array(); Field=arguments[arguments.length-1-n]; for (i=0;i<this.cols;i++){ if (this.TableData[0][i]==Field){ colindex=i; break; } } if ( colindex==-1 ) return; else { asc_array[0]=this.TableData[0]; for(i=1;i<this.rows;i++){ asc_array[i]=this.TableData[1]; highindex=1; for(j=1;j<this.TableData.length;j++){//找出最小的列值 if (asc_array[i][colindex]>this.TableData[j][colindex]){ asc_array[i]=this.TableData[j]; highindex=j;
}
} if (highindex!=-1) this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));
} }
this.TableData=asc_array; } return; }
function getData(Field,FieldValue){ var colindex=-1; var i,j;
GetData=new Array(); if (typeof(Field)=="undefined" || typeof(FieldValue)=="undefined" ){ return this.TableData; }
for(j=0;j<this.cols;j++){ if (this.TableData[0][j]==Field){ colindex=j; } } if (colindex!=-1){
for(i=1;i<this.rows;i++){ if (this.TableData[i][colindex]==FieldValue){ GetData[i]=new Array(); GetData[i]=this.TableData[i]; } } } return GetData; } function DeletE(){ this.TableData=this.TableData.slice(0,this.rowindex).concat(this.TableData.slice(this.rowindex+1,this.TableData.length)); this.rows=this.TableData.length; return; } function updateField(Field,FieldValue){ var colindex=-1; var i=0; if (typeof(Field) == "number"){ colindex=Field; } else { for (i=0;i<this.cols && this.rowindex<this.rows ;i++){ if (this.TableData[0][i]==Field){ colindex=i; break; } } } if (colindex!=-1) { this.TableData[this.rowindex][colindex]=FieldValue; }
} function movefirst(){ this.rowindex=0; } function movelast(){ this.rowindex=this.rows-1; } function String.prototype.Trim() {return this.replace(/(^\s*)|(\s*$)/g,"");} GetTableData.prototype.MoveNext = movenext; GetTableData.prototype.GetFieldData = getfielddata; GetTableData.prototype.Sort_asc = sort_asc; GetTableData.prototype.Sort_desc = sort_desc; GetTableData.prototype.GetData = getData; GetTableData.prototype.Delete = DeletE; GetTableData.prototype.UpdateField = updateField; GetTableData.prototype.MoveFirst = movefirst;
具体的例子:http://202.119.73.208/NetEAn/com/test/jsprint.htm
在每个文本框的onblur事件中调用校验代码,并且每个文本框中onKeyDown事件中写一个enter转tab函数
//回车键换为tab function enterToTab() { if(event.srcElement.type != 'button' && event.srcElement.type != 'textarea' && event.keyCode == 13) { event.keyCode = 9; } }
2006年11月27日
#
2006年11月2日
#
前提条件:B页面是由A页面打开的。 方法: 在A页面的前台代码中加入以下代码: <script language="javascript">function DownDvasp(htmlurl){var
newwin=window.open(htmlurl,'','toolbar=no,location=no,directories=no,status=no,menub
ar=no,scrollbars=no,resizable=no');return false;}</script> 此代码如果在继承母版页的asp.net页面中就需要加在<asp:Content ID="Content1"
ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">行下。 如果在一般的asp.net页面中就需加在<HEAD>段中。 然后在需链接打开的位置加入: <a href="B.aspx?id=<%# Eval("id")%>" onclick="return DownDvasp(this.href);">回复此留
言</a> 这样单击此链接就可打开一个窗口了。 在B页面的前台代码中加入以下代码: <input type='button' value='关闭窗口'
onclick='javascript:window.opener.location.href="A.aspx";window.close();''> 这样就实现了关闭B窗口的同时重新刷新A窗口的目地。
若只是关闭窗口而不需重新刷新A窗口,只需改成onclick='window.close()'就行了。
下面是我所做的一个回复留言的完整代码: liuyanmanager.aspx <%@ Page Language="C#" MasterPageFile="~/admin/MasterPageadmin.master"
AutoEventWireup="true" CodeFile="liuyanmanager.aspx.cs"
Inherits="admin_liuyanmanager" Title="Untitled Page" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1"
Runat="Server"> <script language="javascript">function DownDvasp(htmlurl){var
newwin=window.open(htmlurl,'','toolbar=no,location=no,directories=no,status=no,menub
ar=no,scrollbars=no,resizable=no');return false;}</script> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="id" DataSourceID="SqlDataSourcehufu" Width="100%"> <Columns> <asp:TemplateField HeaderText="会员名" SortExpression="userid"> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("userid")
%>' Visible="False"></asp:Label> <asp:FormView ID="FormView1" runat="server"
DataSourceID="SqlDataSourceuser"> <ItemTemplate> <asp:Label ID="UserNameLabel" runat="server"
Text='<%# Bind("UserName") %>'></asp:Label><br /> </ItemTemplate> </asp:FormView> <asp:SqlDataSource ID="SqlDataSourceuser" runat="server"
ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString %>" SelectCommand="SELECT UserId, UserName FROM vw_aspnet_Users
WHERE (UserId = @userid)"> <SelectParameters> <asp:ControlParameter ControlID="Label1" Name="userid"
PropertyName="Text" /> </SelectParameters> </asp:SqlDataSource> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="留言" SortExpression="liuyan"> <ItemTemplate> <asp:Label ID="Label2" runat="server" Text='<%# Bind("liuyan")
%>'></asp:Label> </ItemTemplate> <ItemStyle Width="520px" /> </asp:TemplateField> <asp:TemplateField HeaderText="留言时间" SortExpression="liuyantime"> <ItemTemplate> <asp:Label ID="Label4" runat="server" Text='<%#
Bind("liuyantime") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="回复"> <ItemTemplate> <a href="hufu.aspx?id=<%# Eval("id")%>" onclick="return
DownDvasp(this.href);">回复此留言</a> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSourcehufu" runat="server" ConnectionString="<%$
ConnectionStrings:articleConnectionString %>" SelectCommand="SELECT id, userid, liuyan, hufu, liuyantime FROM liuyan WHERE
(hufu = N'未回复')"> </asp:SqlDataSource> </asp:Content>
hufu.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="hufu.aspx.cs"
Inherits="admin_hufu" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>回复留言</title> </head> <body> <form id="form1" runat="server"> <div> <table align="center" border="0" cellpadding="0" cellspacing="0"
style="width: 500px"> <tr> <td style="width: 500px"> </td> </tr> <tr> <td style="width: 500px"> <asp:FormView ID="FormView1" runat="server" DataKeyNames="id"
DataSourceID="SqlDataSource1" Width="500px"> <ItemTemplate> <table border="0" cellpadding="0" cellspacing="0"
style="width: 480px"> <tr> <td width="480" style="text-align: center"
align="center" valign="top"> <asp:Label ID="useridLabel" runat="server"
Text='<%# Bind("userid") %>' Visible="False"></asp:Label><asp:FormView ID="FormView2" runat="server"
DataSourceID="SqlDataSourceuser"> <ItemTemplate> 来自 <asp:Label ID="UserNameLabel"
runat="server" Text='<%# Bind("UserName") %>'></asp:Label>的留言:<br /> </ItemTemplate> </asp:FormView> </td> </tr> <tr> <td width="480" align="center"> <asp:TextBox ID="TextBox1"
runat="server" Height="80px" ReadOnly="True" Text='<%# Bind("liuyan") %>' TextMode="MultiLine"
Width="480px"></asp:TextBox></td> </tr> </table> <asp:SqlDataSource ID="SqlDataSourceuser"
runat="server" ConnectionString="<%$ ConnectionStrings:ASPNETDBConnectionString %>" SelectCommand="SELECT UserId, UserName
FROM vw_aspnet_Users WHERE (UserId = @UserId)"> <SelectParameters> <asp:ControlParameter
ControlID="useridLabel" Name="UserId" PropertyName="Text" /> </SelectParameters> </asp:SqlDataSource> </ItemTemplate> </asp:FormView> </td> </tr> <tr> <td style="width: 500px"> 回复:</td> </tr> <tr> <td align="left" style="width: 500px"> <asp:TextBox ID="txthufu" runat="server" Height="80px"
TextMode="MultiLine" Width="480px"></asp:TextBox></td> </tr> <tr> <td align="center" style="width: 500px"> <asp:Button ID="Button1" runat="server" Text="回复"
OnClick="Button1_Click" />
<input type='button' value='关闭窗口'
onclick='javascript:window.opener.location.href="liuyanmanager.aspx";window.close();
''></td> </tr> </table> </div> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$
ConnectionStrings:articleConnectionString %>" SelectCommand="SELECT [id], [userid], [liuyan], [hufu] FROM [liuyan]
WHERE ([id] = @id)"> <SelectParameters> <asp:QueryStringParameter Name="id" QueryStringField="id"
Type="Int32" /> </SelectParameters> </asp:SqlDataSource> </form> </body> </html> hufu.aspx的部分后台代码: protected void Button1_Click(object sender, EventArgs e) { string hufustring = this.txthufu.Text.Trim(); if (hufustring != "" && hufustring != string.Empty) { hufustring = hufustring.Replace("'", "“"); string sql = "UPDATE liuyan SET hufu ='"+hufustring+"' WHERE id =
'"+Request.QueryString["id"]+"'"; using (SqlConnection connection = new
SqlConnection(ConfigurationManager.ConnectionStrings["articleConnectionString"].Conn
ectionString)) { using (SqlCommand command = new SqlCommand(sql, connection)) { connection.Open(); command.ExecuteNonQuery(); } } }
}
最近在用Asp.Net编写点东西时遇到个问题:即用户在提交表单后按刷新就会重复提交数据,即所谓的“刷新重复提交”的问题。在网上搜 一下,可以找到很多关于这方面的资料,其中有一篇是来自MSDN上的一种解决方法: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 它是通过重新定义 System.Web.UI.Page 类来实现加载页面时,是“刷新”、“后退”请求,还是正常请求,其他的页面则继承了自定义的这 个Page类。感觉他这个方法比较独特,有例子可以下载,有兴趣的可以研究研究。
网上最多的解决此类问题的方法就是不保存缓存,即提交后表单上的数据不会被浏览器的缓存保存,如果此时再遇到刷新或者后退请求时, 就会显示“网页已过期”,数据也就不会重复提交了,这就起到了阻止刷新重复提交的效果。
下面以简单的提交一篇帖子为例,介绍禁用缓存防止刷新重复提交的方法,表单数据包括“标题”和“正文”两个部分。
以下是该方法的代码(post.aspx):
//页面加载
protected void Page_Load(object sender, EventArgs e)
{
//可以在页面加载时设置页面的缓存为“SetNoStore()”,即无缓存
Response.Cache.SetNoStore();
//Session中存储的变量“IsSubmit”是标记是否提交成功的
if ((bool)Session["IsSubmit"])
{
//如果表单数据提交成功,就设“Session["IsSubmit"]”为false
Session["IsSubmit"] = false;
//显示提交成功信息
ShowMsg.Text = " * 提交成功!";
}
else
//否则的话(没有提交,或者是页面刷新),不显示任何信息
ShowMsg.Text = "";
}
//提交按钮(btnOK)单击事件
protected void btnOK_Click(object sender, EventArgs e)
{
if (txtTitle.Text.ToString().Trim() == "")
//ShowMsg是用来显示提示信息的
ShowMsg.Text = " * 标题不能为空!";
else if (txtText.Text.ToString().Trim() == "")
ShowMsg.Text = " * 内容不能为空!";
else
{
//这里是将数据提交到数据库中,省略
/*
string sql = "insert into tab...values(...)";
MyConn.ExecQuery(sql);
*/
//提交成功后,设“Session["IsSubmit"]”为true
Session["IsSubmit"] = true;
//强制转换页面(不可少,否则刷新仍会重复提交,仍转到本页),
通过页面的转换将缓存中的提交的数据都释放了,即提交的标单数据不会被保存到缓存里,
如果后退的话,将会出现该页无法显示
Response.Redirect("post.aspx");
}
}
上面这个方法非常简单也很实用,推荐大家使用。
下面是我自己研究出来的另一种方法,该方法不同于“不保存缓存的方法”,它是让浏览器保存所有页面缓存的。该方法通过随机码的方式 来判断是正常提交还是“刷新”或“后退”的。
首先(提交页面是post.aspx)在 Session 中 增加变量 Rnd 用来存放随机码,同时在提交表单数据时不做处理,而是让页面转到 post.aspx?r=x,这里“x”等于Session["Rnd"],这个时候在页面加载时,通过判断r的值和Session["Rnd"]的值是否相同,如果相同就处理提 交的数据,否则即可认为是“刷新”或者是“后退”操作了,最后再次付给Session["Rnd"]一个随机码。
以下是该方法代码(post.aspx):
//获取随机码
public class MyRnd
{
public static string Rnd()
{
//随机码是由 0-9 a-z A-Z 之间的数字或字母组成的
//下面是生成的20位随机码
//0..9 A..Z a..z
//48-57 65-90 97-122
string rst = "";
Random rr = new Random();
for (int i = 0; i < 20; i++)
{
int ir = 0;
do
{
ir = rr.Next(123);
if((ir >= 48) && (ir <= 57)) break;
else if((ir >= 65) && (ir <= 90)) break;
else if ((ir >= 97) && (ir <= 122)) break;
}
while (true);
rst += ((char)ir).ToString();
}
return rst;
}
}
//页面加载
protected void Page_Load(object sender, EventArgs e)
{
//获取URL中请求的“r”值,如果“r”不存在则 r=""
string r = "";
if(Request.QueryString["r"] != null)
r = Request.QueryString["r"].ToString().Trim();
string t;
//获取 “Session” 中的 “Rnd” 值,用于和“r”比较
t = Session["Rnd"].ToString().Trim();
//如果“r=t”则为提交操作,即可对表单的数据进行处理
if(r == t)
{
if (txtTitle.Text.ToString().Trim() == "")
ShowMsg.Text = " * 标题不能为空!";
else if (txtText.Text.ToString().Trim() == "")
ShowMsg.Text = " * 内容不能为空!";
else {
//这里是将数据提交到数据库中,省略
/*
string sql = "insert into tab...values(...)";
MyConn.ExecQuery(sql);
*/
//提交成功后清空表单数据
txtTitle.Text = "";
txtText.Text = "";
//显示提交成功信息
ShowMsg.Text = " * 提交成功!";
}
}
//否则可以认为是“刷新”或者“后退”操作
else
{
txtTitle.Text = "";
txtText.Text = "";
}
//最后要重新获得“Session["Rnd"]”的值,并将“btnOK.PostBackUrl”设为“Session["Rnd"]”的值
Session["Rnd"] = MyRnd.Rnd();
btnOK.PostBackUrl ="post.aspx?r=" + Session["Rnd"].ToString().Trim();
}
//这里提交按钮(btnOK)单击事件就不需要写任何代码了
通过这种方法,每次加载页面时“Session["Rnd"]”都将得到一个新的值,而在刷新或后退时就不会得到相同的“r”和“t”值,数据也就 不会被重复提交,只有通过“btnOK”来提交的操作才会得到“r==t”,数据才会被提交处理的,通过判断随机码的方式来阻止刷新重复提交就 可以实现了。
最近在用Asp.Net编写点东西时遇到个问题:即用户在提交表单后按刷新就会重复提交数据,即所谓的“刷新重复提交”的问题。在网上搜 一下,可以找到很多关于这方面的资料,其中有一篇是来自MSDN上的一种解决方法: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 它是通过重新定义 System.Web.UI.Page 类来实现加载页面时,是“刷新”、“后退”请求,还是正常请求,其他的页面则继承了自定义的这 个Page类。感觉他这个方法比较独特,有例子可以下载,有兴趣的可以研究研究。
网上最多的解决此类问题的方法就是不保存缓存,即提交后表单上的数据不会被浏览器的缓存保存,如果此时再遇到刷新或者后退请求时, 就会显示“网页已过期”,数据也就不会重复提交了,这就起到了阻止刷新重复提交的效果。
下面以简单的提交一篇帖子为例,介绍禁用缓存防止刷新重复提交的方法,表单数据包括“标题”和“正文”两个部分。
以下是该方法的代码(post.aspx):
//页面加载
protected void Page_Load(object sender, EventArgs e)
{
//可以在页面加载时设置页面的缓存为“SetNoStore()”,即无缓存
Response.Cache.SetNoStore();
//Session中存储的变量“IsSubmit”是标记是否提交成功的
if ((bool)Session["IsSubmit"])
{
//如果表单数据提交成功,就设“Session["IsSubmit"]”为false
Session["IsSubmit"] = false;
//显示提交成功信息
ShowMsg.Text = " * 提交成功!";
}
else
//否则的话(没有提交,或者是页面刷新),不显示任何信息
ShowMsg.Text = "";
}
//提交按钮(btnOK)单击事件
protected void btnOK_Click(object sender, EventArgs e)
{
if (txtTitle.Text.ToString().Trim() == "")
//ShowMsg是用来显示提示信息的
ShowMsg.Text = " * 标题不能为空!";
else if (txtText.Text.ToString().Trim() == "")
ShowMsg.Text = " * 内容不能为空!";
else
{
//这里是将数据提交到数据库中,省略
/*
string sql = "insert into tab...values(...)";
MyConn.ExecQuery(sql);
*/
//提交成功后,设“Session["IsSubmit"]”为true
Session["IsSubmit"] = true;
//强制转换页面(不可少,否则刷新仍会重复提交,仍转到本页),
通过页面的转换将缓存中的提交的数据都释放了,即提交的标单数据不会被保存到缓存里,
如果后退的话,将会出现该页无法显示
Response.Redirect("post.aspx");
}
}
上面这个方法非常简单也很实用,推荐大家使用。
下面是我自己研究出来的另一种方法,该方法不同于“不保存缓存的方法”,它是让浏览器保存所有页面缓存的。该方法通过随机码的方式 来判断是正常提交还是“刷新”或“后退”的。
首先(提交页面是post.aspx)在 Session 中 增加变量 Rnd 用来存放随机码,同时在提交表单数据时不做处理,而是让页面转到 post.aspx?r=x,这里“x”等于Session["Rnd"],这个时候在页面加载时,通过判断r的值和Session["Rnd"]的值是否相同,如果相同就处理提 交的数据,否则即可认为是“刷新”或者是“后退”操作了,最后再次付给Session["Rnd"]一个随机码。
以下是该方法代码(post.aspx):
//获取随机码
public class MyRnd
{
public static string Rnd()
{
//随机码是由 0-9 a-z A-Z 之间的数字或字母组成的
//下面是生成的20位随机码
//0..9 A..Z a..z
//48-57 65-90 97-122
string rst = "";
Random rr = new Random();
for (int i = 0; i < 20; i++)
{
int ir = 0;
do
{
ir = rr.Next(123);
if((ir >= 48) && (ir <= 57)) break;
else if((ir >= 65) && (ir <= 90)) break;
else if ((ir >= 97) && (ir <= 122)) break;
}
while (true);
rst += ((char)ir).ToString();
}
return rst;
}
}
//页面加载
protected void Page_Load(object sender, EventArgs e)
{
//获取URL中请求的“r”值,如果“r”不存在则 r=""
string r = "";
if(Request.QueryString["r"] != null)
r = Request.QueryString["r"].ToString().Trim();
string t;
//获取 “Session” 中的 “Rnd” 值,用于和“r”比较
t = Session["Rnd"].ToString().Trim();
//如果“r=t”则为提交操作,即可对表单的数据进行处理
if(r == t)
{
if (txtTitle.Text.ToString().Trim() == "")
ShowMsg.Text = " * 标题不能为空!";
else if (txtText.Text.ToString().Trim() == "")
ShowMsg.Text = " * 内容不能为空!";
else {
//这里是将数据提交到数据库中,省略
/*
string sql = "insert into tab...values(...)";
MyConn.ExecQuery(sql);
*/
//提交成功后清空表单数据
txtTitle.Text = "";
txtText.Text = "";
//显示提交成功信息
ShowMsg.Text = " * 提交成功!";
}
}
//否则可以认为是“刷新”或者“后退”操作
else
{
txtTitle.Text = "";
txtText.Text = "";
}
//最后要重新获得“Session["Rnd"]”的值,并将“btnOK.PostBackUrl”设为“Session["Rnd"]”的值
Session["Rnd"] = MyRnd.Rnd();
btnOK.PostBackUrl ="post.aspx?r=" + Session["Rnd"].ToString().Trim();
}
//这里提交按钮(btnOK)单击事件就不需要写任何代码了
通过这种方法,每次加载页面时“Session["Rnd"]”都将得到一个新的值,而在刷新或后退时就不会得到相同的“r”和“t”值,数据也就 不会被重复提交,只有通过“btnOK”来提交的操作才会得到“r==t”,数据才会被提交处理的,通过判断随机码的方式来阻止刷新重复提交就 可以实现了。
一、如何使用变量给数据源控件参数赋值 在VS2005中数据源控件的参数类型有六种:ControlParameter 、CookieParameter 、FormParameter 、ProfileParameter 、QueryStringParameter 、SessionParameter。利用这些参数类型可以很方便的给数据源控件的参数赋值。但 在实际编程中我们经常要使用变量给数据源控件的参数赋值,那么如何使用变量来赋值呢? 方法如下: 1、在前台代码中写好带参数的查询语句: <asp:SqlDataSource ID="SqlDataSourcedown" runat="server" ConnectionString="<%$ ConnectionStrings:articleConnectionString %>" SelectCommand="SELECT TOP (15) id, name, type FROM kejian WHERE (isfabu = 1) AND (kemuid = @kemuid) AND (lianjiid=@lianjiid) ORDER BY downn DESC"> <SelectParameters> <asp:Parameter Name="kemuid" /> <asp:Parameter Name="lianjiid" /> </SelectParameters> </asp:SqlDataSource> 2、在后台代码中加入如下语句: int kemuid = 0; int lianjiid = 0; protected void Page_Load(object sender, EventArgs e) { int id = Convert.ToInt32(Request.QueryString["id"]); string sql = "select kemuid,lianjiid from kejian where id=" + id; using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["articleConnectionString"].ConnectionString)) { using (SqlCommand command = new SqlCommand(sql, connection)) { connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { if (reader.Read()) { kemuid = (int)reader["kemuid"]; lianjiid = (int)reader["lianjiid"]; } } } } this.SqlDataSourcedown.SelectParameters.Clear(); this.SqlDataSourcedown.SelectParameters.Add("kemuid", System.TypeCode.Int32, kemuid.ToString()); this.SqlDataSourcedown.SelectParameters.Add("lianjiid", System.TypeCode.Int32, lianjiid.ToString()); } 请注意前后台代码中的红色部分,前后台代码中参数名一定要一致。就能实现使用变量来给参数赋值了。 是不是很简单很方便呢? 二、如何动态增减数据源控件参数并支持分页 适于环境: 页面search.aspx接受两个查询变量kemu及name,当kemu=0时进行全部科目的查询,当kemu!=0时进行当前科目的查询,并且要求对查询的结果进行分页。 实现方法: 在前台代码中加入: <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:articleConnectionString %>" SelectCommand="SELECT kejian.id, kejian.name, kejian.huanjing, kejian.type, kejian.downn, kejian.isfabu, kejian.stars, kejian.size, kejian.kemuid, kejian.updowntime, kemu.name AS kemu, lianji.name AS lianji FROM kejian INNER JOIN kemu ON kejian.kemuid = kemu.id INNER JOIN lianji ON kejian.lianjiid = lianji.id WHERE (kejian.name LIKE N'%' + @name + N'%') AND (kejian.kemuid = @kemu) AND (kejian.isfabu = 1) ORDER BY kejian.updowntime DESC"> <SelectParameters> <asp:Parameter Name="name" /> <asp:Parameter Name="kemu" /> </SelectParameters> </asp:SqlDataSource> 在后台代码中加入: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GridViewDataBind(Convert.ToInt32(Request.QueryString["kemu"]), Request.QueryString["name"]); } }
private void GridViewDataBind(int kemu, string name) { string sql = "SELECT kejian.id, kejian.name, kemu.name AS kemu, lianji.name AS lianji, kejian.huanjing, kejian.type, kejian.downn, kejian.stars, kejian.size, kejian.kemuid "; sql += " FROM kejian INNER JOIN kemu ON kejian.kemuid = kemu.id INNER JOIN lianji ON kejian.lianjiid = lianji.id "; sql += " WHERE (kejian.isfabu = 1) ";
if (kemu == 0) { sql += " AND (kejian.name LIKE N'%' + @name + N'%') ORDER BY kejian.updownuserid DESC"; this.SqlDataSource1.SelectParameters.Clear(); this.SqlDataSource1.SelectParameters.Add("name", System.TypeCode.String, name); } else { sql += " AND (kejian.kemuid = @kemu) AND (kejian.name LIKE N'%' + @name + N'%') ORDER BY kejian.updownuserid DESC"; this.SqlDataSource1.SelectParameters.Clear(); this.SqlDataSource1.SelectParameters.Add("kemu", System.TypeCode.String, kemu.ToString()); this.SqlDataSource1.SelectParameters.Add("name", System.TypeCode.String, name); }
SqlDataSource1.SelectCommand = sql; }
protected void GridView1_PageIndexChanged(object sender, EventArgs e) { GridViewDataBind(Convert.ToInt32(Request.QueryString["kemu"]), Request.QueryString["name"]); }
2006年10月30日
#
2006年10月23日
#
摘要: www.youtube.com上很多很好的视频。。可是又没办法下载。。就去搜了搜。。结果发现果然有达人研究出如何下载。。。贴出来方便大家一下。。。下载方法:下载上面视频的方法。。共分三步: 第一步:点击这个网址: http://kej.tw/flvretriever/ 第二步:把youtube地址粘到这个网站上.然后按RETRIEVE NOW! 进行找出FLV地址. 第三步:把得到的地址用... 阅读全文
|