数据绑定表达式包含在 <%#%> 分隔符之内,并使用 EvalBind 函数。
Eval 函数用于定义单向(只读)绑定。Bind 函数用于定义双向(可更新)绑定。
除了通过在数据绑定表达式中调用 EvalBind 方法执行数据绑定外,还可以调用 <%#%> 分隔符之内的任何公共范围代码,以在页面处理过程中执行该代码并返回一个值。

Eval 方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind 方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。eval()方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法

使用 Eval 方法

Eval 方法可计算数据绑定控件(如 GridViewDetailsViewFormView 控件)的模板中的后期绑定数据表达式。在运行时,Eval 方法调用 DataBinder 对象的 Eval 方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 GridView 控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 Eval 方法。

Eval 方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为 String类的 Format 方法定义的语法。

使用 Bind 方法

Bind 方法与 Eval 方法有一些相似之处,但也存在很大的差异。虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用 Bind 方法。

在 ASP.NET 中,数据绑定控件(如 GridViewDetailsViewFormView 控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了 SQL Select、Insert、Delete 和 Update 语句,则通过使用 GridViewDetailsViewFormView 控件模板中的 Bind 方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的 EditItemTemplateInsertItemTemplate 中要使用 Bind 函数。

Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。

Bind 方法采用数据字段的名称作为参数,从而与绑定属性关联

显式调用 DataBind 方法

一种情况就是使用 DataSource属性(而非 DataSourceID 属性)将某个控件绑定到数据源控件时。在这种情况下,需要显式调用 DataBind 方法,从而执行数据绑定和解析数据绑定表达式。
另一种情况就是需要手动刷新数据绑定控件中的数据时。

 

posted @ 2010-11-03 14:04 I day-day-up↑ 阅读(651) 评论(1) 编辑

usemap是<img>标签的一个属性,用作指明所使用的图像地图名。 
后面的#Map的Map就是用<map>标签定义的一个图像地图,它的name属性是Map,像下面这样定义: 

<map name="Map"> 
<area shape=rect coods="100,100,200,200" href="test1.html"> 
<area shape=rect coods="200,100,300,200" href="test2.html"> 
... 
</map> 

使用时: 
<img src="test.gif" usemap="#Map"> 
图像地图把一幅图像分成若干个区域,点击不同的区域会进入不同的页面。

为了创建客户端图像映像,需要增加新属性USEMAP如下:
〈IMG SRC="map_name.gif" USEMAP="#section_name">
属性USEMAP(使用图像)接受段块式的超级链接,因此可以在同一HTML文件中存储映像定义信息。

你见过“联想”机器上联想公司赠送的“我的办公室”软件的界面吗?在那幅办公室的图片上用鼠标点一下办公桌上的键盘,就启动一个“五笔字型”打字练习软件,点一下办公桌上的记事本就打开一个记事本软件,如此等等,即形象又方便。这种效果的实质是把一幅图片划分为不同的作用区域,再让不同的区域链接到做不同事情的软件上去,在HTML中也有一个具有把图片划分成多个作用区域,并链接到不同网页的标记,那就是 <area>地图作用区域标记。
  <area>标记主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面。其基本语法结构如下:
<area
class=type
id=Value
href=url
alt=text
shape=area-shape
coods=value>
  其中。class和id:是分别指定热点的类型和id号。
alt:用于设定热点的替代性文字。
href:用于设定该热点所链接的url地址。
shape和coords:是两个主要的参数,用于设定热点的形状和大小。其基本用法如下:
<area shape="rect" coords="x1, y1,x2,y2" href=url>表示设定热点的形状为矩形,左上角顶点坐标为(X1,y1),右下角顶点坐标为(X2,y2)。
<area shape="circle" coords="x1, y1,r" href=url>表示设定热点的形状为圆形,圆心坐标为(X1,y1),半径为r。
<area shape="poligon" coords="x1, y1,x2,y2 ......" href=url>表示设定热点的形状为多边形,各顶点坐标依次为(X1,y1)、(X2,y2)、(x3,y3) ......。 
  <area>标记是在图像地图中划分作用区域的,因此其划分的作用区域必须在图像地图的区域内,所以在用 <area> 标记划分区域前必须用HTML的另一个标记<map>来设定图像地图的作用区域,并为指定的图像地图设定名称,该标记的用法很简单,即<map name="图像地图名称"> ...... </map>。
  下面通过一个例子来说明这两个标记的用法:

  这里是一幅新书架的图片,要做的效果是:当鼠标点“网址大全”这本书时,新开一窗口,显示关于这本书的简介及订单的网页(urlall.htm);当鼠标点“网站设计攻略”这本书时,新开一窗口,显示关于这本书的简介及订单的网页(siteall.htm);当鼠标点“网页技巧大全”这本书时,新开一窗口,显示关于这本书的简介及订单的网页(pagejqlall.htm)。制作方法:
  1、插入图片,并设置好图像的有关参数,且在<img>标记中设置参数usemap="newbook" ismap,以表示对图像地图(newbook)的引用;
  2、用<map>标记设定图像地图的作用区域,并取名为:newbook;
  3、分别用<area>标记针对三本书的位置划分出三个矩形作用区域,并设定好其链接参数href。
  制作完成,本例的源代码如下:

<img src="image/htmlp3.gif" width="207" height="148" alt="新书架" hspace="10" align="left" usemap="#newbook" border="0">
<map name="newbook">
<area shape="rect" coords="56,69,78,139" href="urlall.htm" target="_blank" alt="这里收集十万多个网址。" title="这里收集十万多个网址。">
<area shape="rect" coords="82,70,103,136" href="siteall.htm" target="_blank" alt="网站设计师的启蒙读本。" title="网站设计师的启蒙读本。">
<area shape="rect" coords="106,68,128,136" href="pageall.htm" target="_blank" alt="网页制作者不可不读的书。" title="网页制作者不可不读的书。">
</map> 

  在制作本文介绍的效果时应注意的几点:
  1、在<img>标记不要忘记设置usemap、ismap参数,且usemap的参数值必须与<map>标记中的name参数值相同,也就是说,“图像地图名称”要一致;
  2、同一“图像地图”中的所有热点区域都要在图像地图的范围内,即所有<area>标记均要在<map>与</map>之间;
  3、在<area>标记中的 cords 参数设定的坐标格式要与shape参数设定的作用区域形状配套,避免出现在shape参数设置的矩形作用区域,而在cords 中设置的却是多边形区域顶点坐标的现象出现。

posted @ 2010-10-29 21:16 I day-day-up↑ 阅读(178) 评论(0) 编辑

(一)简要分析:

1. get是从服务器上获取数据,post是向服务器传送数据。

2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

 

 

(二)(z)

 

详细用法:

很多人都分不清GET与POST的区别,以及什么时候用GET?什么时候用POST?
GET和POST两种方法都是将数据送到服务器,但你该用哪一种呢?
HTTP标准包含这两种方法是为了达到不同的目的。POST用于创建资源,资源的内容会被编入HTTP请示的内容中。例如,处理订货表单、在数据库中加入新数据行等。
当请求无副作用时(如进行搜索),便可使用GET方法;当请求有副作用时(如在数据库添加数据行),则用POST方法。一个比较实际的问题是:GET方法可能会产生很长的URL,或许会超过某些浏览器与服务器对URL长度的限制。
若符合下列任一情况,则用POST方法:

请求的结果有持续性的副作用,例如,数据库内添加新的数据行。    
若使用GET方法,则表单上收集的数据可能让URL过长。    
要传送的数据不是采用7位的ASCII编码。 

 

HTML表单Form中的get和post方法

在 B/S应用程序中,前台与后台的数据交互,都是通过Html中Form表单完成的。Form提供了两种数据传输的方式??get和post。虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响。虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的。
Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:
1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用 “&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。
4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。
5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。
6、Get是Form的默认方法。

下面简单介绍一下ContentType,它和Form中enctype属性的相对应,它是Form用来组织数据的方式,主要包含了两种:
1、application/x-www-form-urlencoded:它是默认内容类型(content type),在结果中我们已经看到了经它编码的数据的效果。编码方法:i.将空格使用“+”代替,非字母和数字字符,是用以%HH表示的该字符的 ASCII代替(汉字就是这种形式);ii.变量和值使用“=”,各个变量和值对之间使用“&”连接。
2、multipart/form-data:它可以用来传输大量二进制数据或者非ASCII字符的文本,因此在上传文件需设置 enctype="multipart/form-data",此时method必须为post。它传输的消息包含了一系列的数据块,每一块都代表 Form中的一个变量,并且数据块的顺序和页面上的顺序一致,块与块之间使用特殊字符(boundary)分隔。如果Form中包含file控件,相应的数据块还会包含一个Content-Type头,用来指定MIME,默认值为text/plain。下面是设置enctype="multipart /form-data"时content的结果:

posted @ 2010-10-29 15:09 I day-day-up↑ 阅读(58) 评论(0) 编辑

提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存。Asp.net下的缓存机制十分强大,用好缓存机制可以让我们极大的改善web应用的性能,下面是一些总结的缓存的知识点,与大家分享交流:

1.页面缓存 

       要实现页面输出缓存,只要将一条 OutputCache 指令添加到页面即可。  

       

<%@ OutputCache CacheProfile=" " NoStore="True | False" Duration="#ofseconds" Shared="True | False"Location="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency="database/table name pair | CommandNotification " VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers"VaryByParam="parametername" %> 

 

             CacheProfile

             用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。在页面中指定此属性时,属性值必须与Web.config文件<outputCacheSettings>配置节下的outputCacheProfiles元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

             NoStore

             该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。

            Duration

             用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。

             Shared

             该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。

            Location

             用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。

             SqlDependency

             该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将基于表的轮询用于@ OutputCache指令。

             VaryByControl

             该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ OutputCache指令中,该属性是必需的。

             VaryByCustom

             用于自定义输出缓存要求的任意文本。如果赋予该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义字符串,则必须在应用程序的Global.asax文件中重写HttpApplication.GetVaryByCustomString方法。

            VaryByHeader

             该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。

             VaryByParam

             该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化,则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。
     
       创建页面输出缓存文件依赖

       示例代码:Response.AddFileDependency(MapPath("test.xml"));
       如需要建立依赖多文件关系,则使用AddFileDependencies()方法。
      
       使用编程方式设置页面缓存过期
      
       示例代码:HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/test.aspx"));
       此方法只接受一个"虚拟绝对"路径,因此需用Page.ResolveUrl()方法转换
      
       使用编程方式设置多个页面缓存过期(创建键依赖(key dependency))
      
       示例代码:
       缓存页面:PageLoad:
        Cache.Insert(“key”,DateTime.Now);
        Response.AddCacheItemDependency("key");
       通过此法向多个页面添加依赖项
       移除依赖项:PageLoad:
       Cache.Remove("key");

       以编程方式操作页面输出缓存

       操作由Response.Cache属性暴露的HttpCachePolicy类对象的方法。

       创建页面输出缓存配置

<system.web>
          <caching>
                <outputCacheSettings>
                    <outputCacheProfiles>
                            <add name="CacheProfile1" duration="60" />
                    </outputCacheProfiles>
                </outputCacheSettings>
          </caching>
       </system.web>

   

 

2.部分页面缓存

       缓存后替换
      
       采用声明方式,使用Substitution控件,设置MethodName属性所需的方法,此方法必须是静态方法,因为当前页输出缓存时,页面实例还没被创建。注:AdRotator内部使用了缓存后替代。
      
       以编程方式设置缓存后替换,使用Response.WriteSubstitution()方法,好处:1,此方法引用的方法不一定是当前类的方法,可以是另一个类的实力或静态方法。2,可以在自定义控件中使用此方法实现缓存后替换。
      
       部分页面缓存:用户控件缓存
      
       给用户控件添加<%@ OutputCache%>指令。此指令包含一个Shared属性,可设置共享用户控件的输出缓存。

       以编程方式设置用户控件缓存

       当用户控件中包括<%@ OutputCache%>指令时,可以通过用户控件的CachePolicy属性所暴露的ControlCachePolicy类的实例的属性控制修改空间如何缓存。

       创建用户控件缓存的文件依赖

       可以使用CacheControlPolicy.Dependency属性在一个缓存了的用户控件和文件系统中一个文件间创建一个依赖,示例代码:
       PageLoad:
       CacheDependency depend=new CacheDependency(MapPath("~/test.xml"));
       this.CachePolicy.Dependency=depend;
      
       缓存动态载入的用户控件

       可以使用Page.LoadControl()方法载入用户控件,当具有缓存特性的用户控件被载入时,Asp.net Framework自动一个PartialCachingControl类的实例包装用户控件。示例代码:
       PageLoad:
       PartialCachingControl cacheme=(PartialCachingControl)Page.LoadControl("test.ascx");
       Cacheme.CachePolicy.SetExpires(DateTime.Now.AddSeconds(10));
       PlaceHolder1.Controls.Add(cacheme);
       Lable1.Text=cacheme.CachePolicy.Duration.ToString();

3.使用DataSource缓存

       SqlDataSource、ObjectDataSource、XmlDataSource控件都包括了用于缓存DataSource承载的属性,好处是数据源控件可以在数据更新时自动重新载入数据。并且可以在多个页面间共享相同的数据,通过一些属性的组合来识别:SelectCommand、SelectParameters、ConnectionString。如果属性相同,即共享相同的缓存数据。

       通过设置属性设置缓存过期策略

       包括绝对缓存(EnableCaching="True" CacheDuration=“xxx”)和Sliding缓存(EnableCaching="True" CacheExpirationPolicy="Sliding" CacheDuration=“xxx”)
      
       使用ObjectDataSource控件缓存
      
       通过设置控件的EnableCaching、CacheExpirationPolicy、CacheDuration属性以及SelectMethod所制定的方法名来完成。

       使用XmlDataSource控件缓存

       设置DataFile属性创建一个文件依赖。

       创建数据源控件键值依赖
      
       操作步骤
       1、设置数据源控件的CacheKeyDependency属性(key);
       2、在Global.asax创建初始化的(key)缓存项目。代码如下:

Void Application_Start(Object Sender,EventArgs e)
        {
             HttpContext context=HttpContext.Current;
             context.Cache.Insert(
             "key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null
            );
        }

       

       3、在用于更改数据的页面上移除缓存项目(key);
       如在DetailsView控件的ItemInserted事件中重新插入缓存项目,此时每个依赖于这个键值(key)的DataSource会自动重新载入数据,代码如下:
       protected void DetailsView_ItemInserted(object sender,DetailsViewInsertedEventArgs e)
       {
           Cache.Insert("key",Datetime.Now);
        }
       注:以上key值采用当前时间并非必须。

4.Cache对象

       几乎可以给缓存添加任何对象,例如,可以添加自定义控件,DataSet,DataTable,ArrayList和List到缓存。注意:使用从缓存中返回的任何项目,应该总是要检查项目是否为空,如果一个项目已经被删除了,则当将来试图从缓存中读取时,就会返回null。
       详细信息查看msdnCache 成员
       添加数据缓存到Cache对象示例代码:

void Page_Load()
        {
             DataTable dt=(DataTable)Cache["dtkey"];
              if(dt==null)
                {
                      dt=getdtFromDB();   //此处调用方法从数据库中返回数据项DataTable
                      Cache.Insert("dtKey",dt,null,DateTime.Now.AddHours(1),Cache.NoSlidingExpiration);   //此处使用绝对过期策略添加项目
                 }
                GridView1.DataSource=dt;
                GridView1.DataBind();
        } 
         private DataTable getdtFromDB()
       {
          //略......
        }

        

 

        使用依赖添加项目

       Asp.net Framework包括三种缓存依赖
       1、CacheDependency——用于创建一个文件依赖或缓存键值依赖。
       2、SqlCacheDependency——用于创建一个对于Microsoft SQL Server数据库表或SQL Server 2005数据库查询的依赖。
       3、AggregateCacheDependency——用于使用多个CacheDependency对象创建依赖,例如,可以用该对象组合文件和Sql依赖。

       CacheDependency类是基类,其他两个类都是从该类继承。

       指定缓存项目优先级
      
       可以指定CacheItemPriority枚举类型任意值。

       配置缓存
       
       详细信息查看Msdn Caching元素

5.使用SQL缓存依赖

       Asp.net Framework支持两种类型的SQL缓存依赖:拉和推。第一种模式使用表轮询的 ASP.NET 实现,第二种模式使用 SQL Server 2005 的查询通知功能。可以对任何最近版本的Ms SQL Server,包括Ms SQL server 2005 Express、Ms SQL Server 2000 和 Ms SQL Server 7.0,使用拉SQL缓存依赖。第二种类型推缓存依赖则只能用于Ms SQL Server 2005和Ms SQL server 2005 Express,因为他们依赖SQL Server的Service Broker。
      
       使用拉SQL缓存依赖

        实质上拉SQL缓存依赖使用数据库tigger,当表被修改时,tigger被触发,名为AspNet_SqlCacheTablesForChangeNotification的数据表的一行数据被更新,来记录修改情况,Asp.net Framework使用一个后台线程,来定期拉数据表的修改信息。如果有修改,则依赖于数据表的缓存项目被移除。
       配置拉SQL缓存依赖:
       1、必须对一个或多个数据库表启用SQL缓存依赖。
            
             可以使用框架中的SqlCacheDependencyAdmin类来配置SQL数据库支持拉SQL缓存依赖,由于调用该类的方法需要创建表、存储过程、trigger,出于安全考虑,Asp.net进程并不应该被赋予这些权限,而是通过一个命令行工具来使用此类。
             aspnet_regsql 详细信息访问Msdn ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe)

             简要步骤: 1、启用特定数据库的SQL缓存依赖。
             aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed
                                2、启用特定表的SQL缓存依赖。
             aspnet_regsql -c "Data Source=localhost;integrated Security=True;Initial Catalog=Pubs" -ed -t Titles

       2、必须在Web配置文件中配置SQL缓存依赖。
             
      a、 对页面输出缓存使用拉SQL缓存依赖:<%@ OutputCache%>指令指定sqlDependency属性值:库名和表名(Mydatabase:Mytable);
      
       b、对DataSource控件使用拉SQL缓存依赖:为DataSource控件sqlDependency属性指定值:库名和表名(Mydatabase:Mytable);

<!-- caching section group -->
                <caching>
                <sqlCacheDependency enabled = "true" pollTime = "1000" >   //通过pollTime 的设置,定时拉数据库的修改
                    <databases>
                      <add name="Northwind" 
                         connectionStringName="NorthwindConnectionString1"
                       pollTime = "1000" 
                      />
                    </databases>
                </sqlCacheDependency>
                </caching>

 

 

       c、对Cache对象使用拉SQL缓存依赖:

void Page_Load()
        {
             DataTable dt=(DataTable)Cache["dtkey"];
              if(dt==null)
                {
                      dt=getdtFromDB();   //此处调用方法从数据库中返回数据项DataTable
                      SqlCacheDependency sqlDepend=new SqlCacheDependecy("Mydatabase","Mytable");
                      Cache.Insert("dtKey",dt,sqlDepend); 
                 }
                GridView1.DataSource=dt;
                GridView1.DataBind();
        } 
         private DataTable getdtFromDB()
       {
          //略......
        }

       
       使用推SQL缓存依赖

       通过Service Broker可以在数据库中的数据变更时自动给应用程序发送一个消息。
       好处:Asp.net应用程序不必定时拉数据库的修改。
       缺点:查询类型有诸多限制(如必须使用两部分的表明:abo.mytabel,查询必须包含一个显示的列名表明:不能使用*,不能引用视图、临时表等,不能包含子查询、外连接、子连接,不能引用大对象、不能使用DISTINCT、COMPUTE、COMPUTE BY、INSERT关键字、不能包含许多聚合函数 等等)

       1.为推SQL缓存依赖配置数据库
       启用Ms SQL Server 2005 Service Broker:
       a、可以通过:Select name ,is_broker_enabled from sys_databases,查询是否对特定的数据库激活。
       b、通过:Alter Database MyBase Set ENABLE_BROKER,启用。
       c、为本地AspNet帐号赋予需要的权限,如:Grant Subscribe Query Notifications To “yourserver\Aspnet”

       2.为推SQL缓存依赖配置应用程序

 void Application_Start(object sender, EventArgs e)
       {
             string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString;
             SqlDependency.Start(conString);
             HttpContext context=HttpContext.Current;
             context.Cache.Insert(
             "key",DateTime.Now,null,DateTime.MaxValue,Cache.NoSlidingExpiration,CacheItemPriority.NotRemovable,null
            );
        }

      

       a、对页面输出缓存使用推SQL缓存依赖:
       当缓存整个Asp.net页面时,可以使用推Sql缓存依赖。如果包含在页面上的任何Sql命令的结果有变动,页面就会自动从缓存中过期。
       SqlCommand对象包含一个NotificationAutoEnlist属性,该属性默认值为true。当NotificationAutoEnlist启用时,页面和命令间自动创建一个推缓存依赖。注意SqlDataSource的SelectCommand必须符合查询要求。
      
    b、对DataSource控件使用推SQL缓存依赖:
       只需要设置SqlcacheDependency属性即可。设置SqlCacheDependency=“CommandNotification”
      
    c、对Cache对象使用推SQL缓存依赖:
       

void Page_Load()
        {
             DataTable dt=(DataTable)Cache["dtkey"];
              if(dt==null)
                {
                      string conString=WebConfigurationManager.ConnectionStrings["MyContention1"].ConnectionString;
                      SqlDatadapter dad=new SqlDataAdapter("Select a,b From dbo.Mytable",conString); //注意查询符合要求
                      SqlCacheDependency sqlDepend=new SqlCacheDependecy(dad.SelectCommand);
                      dt=new DataTable();
                      dad.Fill(dt);
                      Cache.Insert("dtKey",dt,sqlDepend); 
                 }
                GridView1.DataSource=dt;
                GridView1.DataBind();
        }

 

       注意,SqlCacheDependency类的示例被创建了。一个SqlCommand对象被传递给SqlCacheDependency类的构造函数。如果SqlCommand的结果变化了,则这个DataTable会自动从缓存中失效。这些命令的顺序很重要。必须在执行该命令之前创建SqlCacheDependency对象。如果在创建SqlCacheDependency对象之前调用Fill()方法,则依赖会被忽略。

posted @ 2010-10-29 14:54 I day-day-up↑ 阅读(163) 评论(0) 编辑

缓存是在内存存储数据的一项技术,也是ASP.NET中提供的重要特性之一。例如你可以在复杂查询的时候缓存数据,这样后来的请求就不需要从数据库中取数据,而是直接从缓存中获取。通过使用缓存可以提高应用程序的性能。

  主要有两种类型的缓存:

  ·输出缓存Output caching

  ·数据缓存Data caching

  1. 输出缓存(Output Caching)

  使用输出缓存,你可以缓存最后输出的HTML页面,当相同的页面再次请求的时候,ASP.NET不会再执行页面的生命周期和相关代码而是直接使用缓存的页面,语法如下:

<%@ OutputCache Duration=”60” VaryByParam=”None”  %> 

     //Duration 属性设置页面将被缓存60妙。任何的用户请求都会被缓存,在缓冲的60秒内相同的请求都会直接使用缓存的页面。当缓存过期后ASP.NET会再次执行页面代码并且为下一个60秒创建一个新的HTML缓存。
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
        CodeFile="OutputCachingTest.aspx.cs" Inherits="OutputCachingTest" Title="Untitled Page" %>
<%@ OutputCache Duration="20" VaryByParam="None" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
   <div class="title">Output Cache</div>
   Date: <asp:Label ID="lblDate" runat="server" Text="" />
   Time: <asp:Label ID="lblTime" runat="server" Text="" />       
</asp:Content>
protected void Page_Load(object sender, EventArgs e)
{
   lblDate.Text = DateTime.Now.ToShortDateString();
   lblTime.Text = DateTime.Now.ToLongTimeString(); 
} 

 在这个例子中页面将被缓存20秒。

  ·通过查询字符串缓存(Cache by Query String )

  在实际应用中页面往往会根据一些参数动态的改变页面的内容。如果你的页面是通过查询字符串来获取信息的,你可以根据查询字符串很容易的缓存页面的不同拷贝。VarByParam=”None”指定ASP.NET只存储缓存页面的一个拷贝。VarByParam=”*” 指定ASP.NET根据不同的查询字符串存储不同的缓存页面。

   上面的例子中,在查询字符串中传了不同的ID.ASP.NET为每一个ID都存储了单独的缓存页面。这种方式会有一些问题就是当查询字符串范围很广的时候。这个时候我们可以在VarByParam 属性中指定重要的查询字符串变量的名字,如下:

<%@ OutputCache Duration="60" VaryByParam="*" %>
<div align="right">
   <a href="OutputCachingTest2.aspx">No Query String</a> | 
   <a href="OutputCachingTest2.aspx?id=1">ID 1</a> | 
   <a href="OutputCachingTest2.aspx?id=2">ID 2</a> | 
   <a href="OutputCachingTest2.aspx?id=3">ID 3</a> |
   <a href="OutputCachingTest2.aspx?id=3&langid=1">ID 3</a>
</div> 

  这样,ASP.NET可以根据id” or “langid”来缓存不同的缓存版本。

  ·自定义缓存(Custom Caching)

  你也可以创建自定义的程序来缓存页面。ASP.NET提供了一种很便捷的方式来创建自定义缓存,使用VarByCustom属性指定自定义缓存类型的名字。
%@OutputCacheDuration="60"VaryByParam="id;langid"%

   你还要创建为缓存生成自定义字符串的方法,如下:
 

public override stringGetVaryByCustomString(HttpContext context, stringcustom)
{
    if(custom == "browser")
    {
       returncontext.Request.Browser.Browser + context.Request.Browser.MajorVersion;
    }
    else
   {
       return base.GetVaryByCustomString(context, custom);
    }
} 

 这个方法必须写在global.asax文件中。ASP.NET使用该方法返回的字符串来实现缓存,如果这个方法在不同的请求中返回相同的字符串,ASP.NET就会使用缓存的页面,否则就会生成新的缓存版本。

  上面的例子中GetVaryByCustomString()方法根据浏览器的名字创建缓存字符串,ASP.NET会根据不同的浏览器请求创建不同版本的缓存。

  ·控件缓存(Control Cache )

  上面的缓存技术可以让你很容易的缓存整个页面,如果要缓存指定控件的内容,可以通过指定VaryByControl 属性来完成。

<%@OutputCacheDuration="20"VaryByControl="MyControl_1"% >

   上面代码ASP.NET将会缓存MyControl_1控件20分钟。如果要根据一些属性值来缓存控件只需要将OutPutCache指令加入*.ascx页面。
<%@Control Language="C#"AutoEventWireup="true"CodeFile="MyControl.ascx.cs"Inherits="Controls_MyControl"%>
%@OutputCacheDuration="20"VaryByControl="EmployeeID"%

  VaryByControl=”EmployeeID”告诉ASP.NET根据控件中声明的EmployeeID属性来创建不同版本的缓存。

  在 .ascx.cs 文件加入EmplyeeID属性为ASP.NET 缓存使用。
private int_employeeID;
public intEmployeeID{
   get{ return_employeeID; }
   set{ _employeeID = value; }}
protected voidPage_Load(objectsender, EventArgs e){
   lblDate.Text = DateTime.Now.ToShortDateString();
   lblTime.Text = DateTime.Now.ToLongTimeString();
   lblEmployeeID.Text = EmployeeID.ToString();} 

   在页面中增加控件并且设置 EmployeeID.
<%@RegisterSrc="Controls/MyControl.ascx"TagName="MyControl"TagPrefix="uc1"%>
<asp:ContentID="Content1"ContentPlaceHolderID="ContentPlaceHolder1"runat="Server">
    <divalign="center">
        <uc1:MyControlID="MyControl1"runat="server"EmployeeID="1"></uc1:MyControl>
    </div>
</asp:Content> 


   

·缓存配置文件(Cache Profile )

  web.config可以配置缓存相关的设置,

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
     <addname="ProductItemCacheProfile" duration="60"/>
   </outputCacheProfiles>
</outputCacheSettings>
   </caching>
</system.web> 

 

  你可以通过设置 CacheProfile=”ProfileName” 属性 来使用上面的配置:
%@OutputCacheCacheProfile="ProductItemCacheProfile"VaryByParam="None"%

   2. 数据缓存(Data Caching)

  ASP.NET还提供了另一种灵活的缓存类型:数据缓存。你可以将一些耗费时间的条目加入到一个对象缓存集合中,以键值的方式存储。
Cache["Name"] = data;

   我们可以通过使用Cache.Insert()方法来设置缓存的过期,优先级,依赖项等。  

date1 = DateTime.Now;
  Cache.Insert("Date1", date1, null, DateTime.Now.AddSeconds(20), TimeSpan.Zero);

  ASP.NET允许你设置一个绝对过期时间或滑动过期时间,但不能同时使用。

  ·缓存依赖项Cache dependency

缓存依赖项使缓存依赖于其他资源,当依赖项更改时,缓存条目项将自动从缓存中移除。缓存依赖项可以是应用程序的 Cache 中的文件、目录或与其他对象的键。如果文件或目录更改,缓存就会过期。

  

date2 = DateTime.Now;
  string[] cacheKeys = { "Date1"};
  CacheDependency cacheDepn = newCacheDependency(null, cacheKeys);
  Cache.Insert("Date2", date2, cacheDepn); 

 

     上面的例子“Date2”缓存对象依赖“Date1”缓存条目,当 “Date1” 对象过期后“Date2” 将会自动过期。CacheDependency(null, cacheKeys)中的第一个参数为空是由于我们只监视缓存键的更改情况。

  ·回调函数和缓存优先级(Callback Method and Cache Priority)

ASP.NET允许我们写一个回调函数,当缓存条目从缓存中移除的时候触发。还可以设置缓存条目的优先级。

  

protected void Page_Load(object sender, EventArgs e)
  {
  DateTime? date1 = (DateTime?)Cache["Date1"];
  if (!date1.HasValue) // date1 == null
  {
  date1 = DateTime.Now;
  Cache.Insert("Date1", date1, null, DateTime.Now.AddSeconds(20), TimeSpan.Zero,
  CacheItemPriority.Default, new CacheItemRemovedCallback(CachedItemRemoveCallBack));
  }
  DateTime? date2 = (DateTime?)Cache["Date2"];
  if (!date2.HasValue) // date2 == null
  {
  date2 = DateTime.Now;
  Cache.Insert("Date2", date2, null, DateTime.Now.AddSeconds(40), TimeSpan.Zero,
  CacheItemPriority.Default, new CacheItemRemovedCallback(CachedItemRemoveCallBack));
  }
  // Set values in labels
  lblDate.Text = date1.Value.ToShortDateString();
  lblTime.Text = date1.Value.ToLongTimeString();
  lblDate1.Text = date2.Value.ToShortDateString();
  lblTime1.Text = date2.Value.ToLongTimeString();
 }
  private void CachedItemRemoveCallBack(string key, object value, CacheItemRemovedReason reason)
  {
  if (key == "Date1" || key == "Date2")
  {
  Cache.Remove("Date1");
  Cache.Remove("Date2");
  }
  } 

 

  例子中创建了“Date1” 和 “Date2”缓存。“Date1” 在20秒后过期“Date2”为40秒。但是由于我们注册了移除的回调函数,当“Date1” 或 “Date2”其中一个过期都会执行CachedItemRemoveCallBack 方法,在这个方法中移除了两个缓存条目,ASP.NET还提供了处理缓存条目更新时的回调函数CacheItemUpdateCallback 。

 

posted @ 2010-10-29 14:47 I day-day-up↑ 阅读(107) 评论(0) 编辑

setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象。可以使用本动作更新来自数据库的变量或更新时间显示。setInterval动作的语法格式如下:

setInterval(function,interval[,arg1,arg2,......argn])
setInterval(object,methodName,interval[,arg1,arg2,.....argn])

第一种格式是标准动作面板中setInterval函数的默认语法,第二种格式是在专家模式动作中使用的方法。
其中的参数function是一个函数名或者一个对匿名函数的引用。object参数指定从Object对象派生的对象。methodName制定 object参数中要调用的方法。interval制定对function或methodName调用两次之间的时间,单位是毫秒。后面的arg1等是可选的参数,用于制定传递给function或是methodName的参数。
setInterval它设置的时间间隔小于动画帧速(如每秒10帧,相当于100毫秒),则按照尽可能接近interval的时间间隔调用函数。而且必须使用updateAfterEvent动作来确保以足够的频率刷新屏幕。如果interval大于动画帧速,则只用在每次播放头进入某一帧是才调用,以减小每次刷新屏幕的影响。
下面的例子每隔1秒调用一次匿名函数。
setInterval(function(){trace("每隔1秒钟我就会显示一次")},1000);//这里的function(){}是没有函数名的函数。成为匿名函数,后面的1000是时间间隔,单位是毫秒。

下面的例子为我们展示如何带参数运行。
function show1(){
    trace("每隔1秒显示一次");
}
function show2(str){
    trace(str);
}
setInterval(show1,1000);
setInterval(show2,2000,"每隔2秒我就会显示一次");上面已经将函数的setInterval方法介绍了。

下面我们将介绍对象的setInterval方法。
首先,写一个setInterval在动作中调用对象的方法的例子,该例子不需要传递参数。
myobj=new Object();//创建一个新的对象
myobj.interval=function){
    trace("每隔1秒显示一次");
}//创建对象的方法。
setInterval(myobj,"interval",1000);//设定时间间隔调用对象的方法。
接下来介绍如何传递参数。其实道理和函数的传递参数是一样的。
myobj=new Object();
myobj.interval-function(str){
    trace(str);
}
setInterval(myobj,"interval",2000," 每隔2秒我就会显示一次");

注意。要调用为对象定义的方法时,必须在专家模式中使用第二种语法格式。
这样子的话呢,我们来作一个动态显示时间的画面。可以用下面的代码实现。
setInterval(show,1000);
function show(){
    time=new Date();
    hour=time.getHours();
       minu=time.getMinutes();
       sec=time.get.Seconds();
    datetime=hour+":"+minu+":"+sec;
}//这里的datetime是一个动态文本框的变量名字。

这样子呢,setInterval这个方法大家应该学的很好了。现在呢,我们学习clearInterval.
clearInterval动作的作用是清楚对setInterval函数的调用,它的语法格式如下clearInterval(intervalid);intervalid是调用setInterval函数后返回的对象。
下面举一个简单的例子。
function show(){
    trace("每隔一秒显示一次");
}
var sh;
sh=setInterval(show,1000);
clearInterval(sh);

 

=======================================================================

 又如:

<script>   
    setInterval( 
    //设置时间间隔
     function() {   
         var date = new Date();   
         if (date.getMinutes() == 0 || date.getMinutes() == 30) {   
             alert("停下工作,休息一下!现在是"+date.getMonth()+"月"+date.getDay()+"日"+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());   
         }   
     }, 1000 * 60);   
</script>

posted @ 2010-10-22 08:58 I day-day-up↑ 阅读(19) 评论(0) 编辑

 
内层元素的高度值300px > 外层元素的高度值200px,因此“外层元素的内容”(也就是“内层元素”)无法完全显示,而外层元素把overflow设置为auto,因此外层元素的右侧会出现一个上下方向的滑动条 
初始状态下,“内层元素的上边界”和“外层元素的上边界”重合,没有任何内容超过“外层元素的上边界”,此时scrollTop属性的值为0。 
当向下拖动滚动条时,超过“外层元素的上边界”的内容会逐渐增多,scrollTop值就等于这些超出的部分。 
当拖动滚动条到最底部时,“内层元素的下边界”和“外层元素的下边界”重合,超过“外层元素的上边界”的内容的高度=300px-200px=100px,这也就是此时的scrollTop值。 
通过js代码来读取,写入scrollTop的值 
注意:scrollTop的使用方式是element.scrollTop,而不是element.style.scrollTop 
通过js代码来读取scrollTop的值 

posted @ 2010-10-22 08:49 I day-day-up↑ 阅读(15) 评论(0) 编辑
posted @ 2010-10-22 08:33 I day-day-up↑ 阅读(6) 评论(0) 编辑
CDN

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。 (也就是一个服务器的内容,平均分部到多个服务器上,服务器智能识别,让用户获取离用户最近的服务器,提高速度。

posted @ 2010-10-15 12:38 I day-day-up↑ 阅读(30) 评论(0) 编辑

服务器相关知识  U的概念

  U是一种表示服务器外部尺寸的单位,是unit的缩略语,详细的尺寸由作为业界团体的美国电子工业协会(EIA)所决定。

  之所以要规定服务器的尺寸,是为了使服务器保持适当的尺寸以便放在铁质或铝质的机架上。机架上有固定服务器的螺孔,以便它能与服务器的螺孔对上号,再用螺丝加以固定好,以方便安装每一部服务器所需要的空间。

  规定的尺寸是服务器的宽(48.26cm=19英寸)与高(4.445cm的倍数)。由于宽为19英寸,所以有时也将满足这一规定的机架称为“19英寸机架”。厚度以4.445cm为基本单位。1U就是4.445cm,2U则是1U的2倍为8.89cm。

  所谓“1U的PC服务器”,就是外形满足EIA规格、厚度为4.445cm的产品。设计为能放置到19英寸机柜的产品一般被称为机架服务器。

  1U服务器就是一种高可用高密度的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的。它们可以通过本地硬盘启动自己的操作系统,如Windows NT/2000/2003、Linux、Solaris等等,类似于一个个独立的服务器。在这种模式下,每一个主板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过我们还是可以用系统软件将这些主板集合成一个服务器集群。

1U服务器

  那么什么是1U服务器呢?所谓的1U服务器就是一种高可用高密度的低成本服务器平台,是专门为特殊应用行业和高密度计算机环境设计的。它们可以通过本地硬盘启动自己的操作系统,如Windows NT/2000/2003、Linux、Solaris等等,类似于一个个独立的服务器。在这种模式下,每一个主板运行自己的系统,服务于指定的不同用户群,相互之间没有关联。不过我们还是可以用系统软件将这些主板集合成一个服务器集群。

 

目前我国的1U式服务器发展已处于发展阶段,国内的用户数量已经很多,当前多以数据中心和科研机构应用的比较广泛。但是由于符合未来计算模式的发展方向,并且在我国网络日益普及的今天,网络技术的应用也越发频繁。针对个人的数据备份、网络游戏平台和中小型企业网站的实施与应用,都已采用这种服务器产品。   随着企业信息化的快速发展,对服务器的需求量也越来越大,在有限的机房的空间里,如何合理的规划与实施,对与我们来说,就不能不重视这些问题。机架式服务器因为配置灵活、计算密度高,在节省能源成本、维护成本、环境成本等方面,对比塔式服务器都有优势。这些优点就给大中型信息系统的建设为1U服务器提供了广泛的发展空间。

posted @ 2010-10-15 11:15 I day-day-up↑ 阅读(150) 评论(0) 编辑