.Net培训个人总结笔记37
学习交流,欢迎转载。转载请注明文章来源:http://www.cnblogs.com/lgjspace/archive/2011/01/12/2214013.html
经验:
HyperLink 控件具有“在新页面中打开”的右键功能,而 Button 和 LinkButton 都没有,这功能可以方便用户在打开新页面的同时不影响已打开的旧页面。
细节:
若要引用二次开发的第三方的 JQuery 插件库,必须在引用这个第三方库之前(位置上要在第三方库的引用代码之前之上)先引用 JQuery 库本身,否则可能会导致第三方的 JQuery 插件库的代码使用出现异常或出错。
技巧:
在 FormView 中如何通过代码找到所要操作的控件,然后传递给客户端操作的方法。
第一种:用传统的方式,即在 ItemCreate、ItemInserting 等事件中通过“*.FindControl()”来取出 Id,然后在服务端中用“Attributes["onclick"] = "addFunction(this)";”为控件添加客户端的属性或响应事件;
第二种:比较取巧的方法,在客户端中需要使用待操作的控件的客户端 Id 的地方放置一个 Literal 控件,在 ItemCreate、ItemInserting 等事件中通过“*.FindControl()”来取出需要被操作的控件,并获得其客户端 Id,然后把 Literal 控件的 Text 属性值设定为要被客户端操作的控件的客户端 Id,这样在页面渲染时 Literal 就会被直接渲染成该客户端 Id(Literal 被渲染到客户端页面时是直接被渲染成它本身的 Text 属性的值,没有任何附带标签),供客户端页面的 js 代码使用。
细节:
在客户端的 <textarea ></textarea> 控件中使用 CKEditor 插件时,必须要求控件有 id 值(或者 name 值),并且 class(服务端控件为 CssClass)属性的值必须为“ckeditor”。
技巧:
在 VS2010 中,自己手动用代码方式禁止 VS 编译器自动对页面内容进行 XSS 漏洞检测的方法:
首先在 aspx 页面顶行的 C# 代码中加上“ValidateRequest = "false"”;然后在本项目中的“Web.config”配置文件中添加或修改如下节点即可:
<system.web>
<httpRuntime requestValidationMode ="2.0"/>
</system.web>
细节:
就算是在页面级别上禁用了 ViewState,也并不等于该页面就完全没有使用 ViewState,只是产生的 ViewState 比禁用之前少了很多很多很多、仅仅保存了页面必须的很少量的 ViewState 而已。如果要求不能出现任何的 ViewState,则页面中不能有被标识为“runat = server”的 form,但一般都不会这么做,因为:
1. 没有必要完全杜绝一丁点的 ViewState,这一点点的 ViewState 内容几乎不影响性能。
2. 如果一旦删除掉带“runat = server”的 form 的话,ASP.NET 中的很多特性和功能就都不能使用了。
3. 所有服务端的控件(如 TextBox、Button 等)如果不放在带“runat = server”的 form 中的话是使用不了的。
经验:
缓存(Cache)是改进网站性能的第一个手段,而索引则是改进数据库性能的第一个手段。
细节:
缓存主要分为:页面缓存、数据源缓存和数据缓存。
细节:
页面缓存只认页面。即对所有的访问者来说,只要访问的是同一个页面(页面地址相同),得到的页面都一样,内容都是该页面最近一次被缓存起来的页面内容。
细节:
缓存的 VaryByParam 属性的使用:
如果一个父页面有多个带 QueryString 的子页面(即父页面转到子页面是通过父页面的地址加上 QueryString 参数来连接的),且该父页面的页面缓存设置中的 VaryByParam 属性值为“none”时,如果该页面的一个子页面被首次访问,则该子页面被缓存,而如果此后有另一个子页面被访问,则访问这个子页面的客户只能得到第一个被缓存的子页面内容,而不会得到预期的另一个子页面的内容。例如:网页地址为“http://www.abc.com/123.html”的页面有两个子页面“http://www.abc.com/123.html?id=1”和“http://www.abc.com/123.html?id=2”,如果第一个子页面“...?id=1”首先被访问,则缓存的是该子页面的内容,此后如果有第二个子页面“...?id=2”被访问,则得到的只是第一个子页面“...?id=1”的内容,而不是预期之中的第二个子页面“...?id=2”。
1. 如果需要防止这种情况,则需要更改 VaryByParam 属性的值,在此例子中,如果要区分两个不同 QueryString 参数标识的子页面的缓存,则 VaryByParam 属性的值应为“id”,即“VaryByParam="id"”(而不是“VaryByParam="none"”);
2. 如果需要区分的 QueryString 中的参数不止一个,例如 id 和 name 都要被区分来缓存(即 id 和 name 两个参数中只要有其中一个不一样,就另外单独缓存),则只需要写成“VaryByParam="id;name"”,即在多个参数之间用分号隔开即可。
3. 上面的 1、2 两种情况也可以用以下这种方式来代替:“VaryByParam="*"”,即用“*”来代替具体的参数名字,这样代替之后,每一个参数不一样的页面地址,程序都会为其单独进行缓存。
细节:
数据源(ObjectDataSource)的缓存设置:
1. 在 ObjectDataSource 标签范围内添加元素“EnableCaching="true"”或是选中 ObjectDataSource 控件,然后在属性窗口中把 EnableCaching 属性的值设为“true”,即可实现数据源的缓存;
2. ObjectDataSource 控件的 CacheDuration 属性是用来设定缓存的时间长度的,以秒为单位。
3. ObjectDataSource 控件的 CacheExpirationPolicy 属性用来设定缓存的策略的,有“Absolute”和“Sliding”两种选择,选中“Sliding”即把缓存设定为“滑动窗口”策略。
注意:
HttpRuntime.Cache 是一个对象,不是一个类。
经验:
通过使用 Reflector 对 HttpRuntime 进行反编译可以发现,HttpRuntime 内部有一个“_cacheInternal”,其内部提供了一个清除缓存的方法来清除缓存,但不是很正路的方法。
细节:
错误页元素 <customErrors /> 中的 mode 属性是用来设置当页面出现错误或异常时显示错误信息的模式,有三个值:“On”、“Off”和“RemoteOnly”,其中“On”和“Off”分别是打开和关闭自定义错误页功能,“打开错误页功能”即当页面出现错误时不是直接把错误的代码或堆栈等重要的内部信息显示出来,而是通过跳转到自定义的页面来提示用户页面出现错误,“关闭错误页功能”则相反。而“RemoteOnly”则是:对外部的客户端链接来说是“打开错误页功能”,而对于内部(即服务器内部)的链接来说是“关闭错误页功能”。
拓展:
在 JavaScript 中对字符串进行 URLEncode 的函数是:encodeURI()。
细节:
在使用 Ajax 时,为了防止页面被缓存而导致 Ajax 向服务器的请求数据失败,可以在 QueryString 中添加每次请求都不一样的字符串片段,让页面的缓存“误以为”是“不同的页面”,从而来防止“缓存阻止了 Ajax 发出的请求”的情况。