编程开发 > ASP > 文章内容

一个“简单”的ASP.NET的服务器控件(二)

2010-10-25编辑:dan

注意:

控件名字:

去烦恼一个控件的名称是非常愚蠢做法,真的是这样吗?错误的命名一个控件(或里任何变量)就像结婚。由于你将要与它走很长一段时间,在将来改变它可能会非常痛苦。所以首先要用好你的命名。

我称这个控件为: HyperlinkFileList.

溢出问题:

如果控件的高度一旦设置,文件的列表超出了控件的高度。就会使文件“溢出”控件的边界。

为了解决这个问题,我说下面代码到控件的构造函数之中:

以下为引用的内容:

  if ((Height != null) && (ScrollBars == ScrollBars.None))
      ScrollBars = ScrollBars.Auto;

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
// use a dependency on the directory being read from for auto refreshing
Page.Cache.Insert(FilesDirectory + FilesFilter,   // unique key
                  m_FilesArray,                   // list of files to store
                  new CacheDependency(FullPath)); // dependency on directory

侧注:当然,这只是一个代码行,但做了几个小时的研究,以决定这是最好的方法去处理状态的管理的问题。有时需要很长的时间编写很少的代码。

Property Editor:

我将所有的自定义属性分组到标题 “Files List”下面。他们都在一个地方与Panel的属性分离开来。

 下面是四个控件在一个页面上的标签

以下为引用的内容:

    <EW:HyperlinkFileList ID="HyperlinkFileList5"  runat="server" BackColor="#FFFF66"
        Height="200px">
    
    <EW:HyperlinkFileList ID="HyperlinkFileList6"  runat="server" FilesTitle="The Same XML Files"
        Height="200px">
    <br >
    <EW:HyperlinkFileList ID="HyperlinkFileList7"  runat="server" BackColor="#66FFFF"
        BorderColor="#FF3300" BorderWidth="3px" FilesDirectory="C:/Peachw/EndSofi/BAK/"
        FilesFilter="*.Zip" FilesTitle="Whole lotta files!" ForeColor="#3333CC" Width="293px"
        Height="156px">
    
    <EW:HyperlinkFileList ID="HyperlinkFileList8"  runat="server" BackColor="#66CCFF"
        Height="156px" Width="198px" FilesDirectory="~/Images/" FilesFilter="*.jpg" 
        FilesTitle="Pretty Pictures">
    

下面是他们渲染之后的样子:

第二部分:自定义服务器控件编辑器

选择文件目录:

我认为粘贴文件的目录路径是业余开发人员使用的法子,所以我决定添加一个目录浏览器。

开发服务器控件编辑器所用时间比开发实际控件用的时间更长。

一个“简单”的ASP.NET的服务器控件(一)

热点推荐

登录注册
触屏版电脑版网站地图