注意:
控件名字:
去烦恼一个控件的名称是非常愚蠢做法,真的是这样吗?错误的命名一个控件(或里任何变量)就像结婚。由于你将要与它走很长一段时间,在将来改变它可能会非常痛苦。所以首先要用好你的命名。
我称这个控件为: HyperlinkFileList.
溢出问题:
如果控件的高度一旦设置,文件的列表超出了控件的高度。就会使文件“溢出”控件的边界。
为了解决这个问题,我说下面代码到控件的构造函数之中:
以下为引用的内容: if ((Height != null) && (ScrollBars == ScrollBars.None)) |
CSS 布局:
因为控件是基本是一个div(panel渲染成一个div),然后,设置“display”属性为“inline-block”,允许多个控件被并排的一起。
以下为引用的内容: Style["display"] = "inline-block"; |
CSS框模型:
我不喜欢文本卡在控件的左侧,所以我添加一些CSS来填充。我也在控件的周围使用一些css样式。使它不会与其它控件贴的很死。
以下为引用的内容: // add spacing outside the control Style["margin"] = "0.5em"; // add space inside the control Style["padding-left"] = "0.5em"; |
状态管理:
在最初的测试的时候, 我发现每次控件都能运行,它都将重新读取的文件目录。文件输入输出代价是很昂贵的。我想去结合的服务器控件的“State”。但它使用的是View State 类型,两次发送文件列表到客户端是效率非常低的 。一次作为HTML列表,一次在ViewState 。
所以我想使用 Session State, Application State 和Cache。
我决定将文件列表放在一个缓存对象之中。使列表能在session之间共享。如果内存在溢出,缓存中的列表将会丢失。
我将文件的目录和文件filter连接在一起,作为缓存中索引键。这样允许多个控件同时使用和共享文件列表。
开始,我添加了使开发人员可以强制重新读取需要的文件的功能。但是,缓存对象可以使用依赖关系:任何从属目录更改会导致缓存过期。最后的代码是非常的简单:
以下为引用的内容: // put the list in the cache so we don't have to read the disk again |
侧注:当然,这只是一个代码行,但做了几个小时的研究,以决定这是最好的方法去处理状态的管理的问题。有时需要很长的时间编写很少的代码。
Property Editor:
我将所有的自定义属性分组到标题 “Files List”下面。他们都在一个地方与Panel的属性分离开来。
下面是四个控件在一个页面上的标签
以下为引用的内容: <EW:HyperlinkFileList ID="HyperlinkFileList5" runat="server" BackColor="#FFFF66" |
下面是他们渲染之后的样子:
第二部分:自定义服务器控件编辑器
选择文件目录:
我认为粘贴文件的目录路径是业余开发人员使用的法子,所以我决定添加一个目录浏览器。
开发服务器控件编辑器所用时间比开发实际控件用的时间更长。
ASP编码教程:如何实现/使用缓存
[ASP]2015年4月15日ASP编码教程:asp缓存的分类
[ASP]2015年4月15日ASP编码教程:何谓ASP缓存/为什么要缓存
[ASP]2015年4月15日ASP编码教程:asp实现的sha1加密解密代码
[ASP]2015年4月15日ASP编码教程:asp执行带参数的sql语句实例
[ASP]2015年4月14日