论Web控件开发 - 完美上传下载控件“新”(一)

为了增加人气,本人特悔过自新从新作人:),将本人开发的上传下载控件一一解析,期望能略微提升一点人气:) ,另请访问本控件示例站点


一、控件开发思想

目前在本人开发的很多项目中都会遇到文件上传下载的问题,为了一次性解决所有这些令人头痛的问题,我特意开发了这个组件。而为了满足大多数的应用场合,在开发之前我特意总结了需要用到上传下载控件的三种场合,并使自己开发的控件完全适应这三种场合。

场合一:
    上传到服务器端的文件名为服务器端指定的文件名,比如我想为某一电子产品维护驱动程序下载,而项目要求下载的文件名必需为
string.Format("{0}_{1}.zip" ,productID, OSName)。如AP2000_WinXp.Zip。

场合二:
    上传到服务器端的文件名为自动生成,主要用来对上传文件量比较大,而对名称没有要求的场合,如新闻中所带的图片等等。

场合三:
    上传到服务器端的文件名为客户端的文件名,就象博客中插入图片或下载文件一样。

为了满足上面三种场合我特意声明了下面的枚举类:

None.gif      public   enum  FileNameType
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        AutoGenerate,
InBlock.gif        ClientSide,
InBlock.gif        ServerSide
ExpandedBlockEnd.gif    }

同时声明如下属性:

None.gif         [ 
None.gif        NotifyParentProperty(
true ),
None.gif        Category(
" Appearance " ), 
None.gif        DefaultValue(
typeof (FileNameType), " ClientSide " )
None.gif        ] 
None.gif        
public  FileNameType UploadFileNameType
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
object o = ViewState[UploadFileNameTypeKey];
InBlock.gif                
return(o==null)? FileNameType.ClientSide:(FileNameType)o;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                ViewState[UploadFileNameTypeKey] 
= value;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }


而通常来讲对于文件的操作无非是上传、下载、删除三个操作,因此界面上并没有很特别的界面元素并没有很复杂的绘制要求,因此我决定用复合控件来实现它的开发,而且对于上传控件我们也不会关心他的高度,背景色,字体等等因此我决定控件从Control继承而不是从WebControl继承,而为了实现子控件的名称的唯一性控件同时实现了INamingContainer标志接口。
而为了使上传的文件名支持验证器控件所以加了validationPropertyAttribute并指向FileName,为了使客户端的验证正常工作,ASP.Net要求在客户端一定存在以控件ID命名的基于input窗体元素,因此我在创建复合控件时还多加了一个inputhidden控件用来支持客户端的验证,该inputhidden.value属性中保存有当前的上传的文件名称.而为了支持有效扩展名数组的内部属性而增加了ParseChildren(true)和PersistChildren(false)属性,由上面的分析我得到了下面的Upload声明.

None.gif     [DefaultProperty( " FileName " ), 
None.gif    ValidationPropertyAttribute(
" FileName " ),
None.gif    ParseChildren(
true ),
None.gif    PersistChildren(
false ),
None.gif    ToolboxData(
" <{0}:Upload runat=server></{0}:Upload> " )]
None.gif    
public   class  Upload : System.Web.UI.Control,INamingContainer
None.gif


为了增加上传文件类型的验证我声明ExtFilter属性用来保存有效的扩展文件名

ContractedBlock.gif ExpandedBlockStart.gif          ExtFilters #region ExtFilters
InBlock.gif        
private StringItemCollection _extFilters;
InBlock.gif        [
InBlock.gif        NotifyParentProperty(
true),
InBlock.gif        PersistenceMode(PersistenceMode.InnerProperty),
InBlock.gif        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
InBlock.gif        ]
InBlock.gif        
public StringItemCollection ExtFilters
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if(_extFilters==null
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    _extFilters 
= new StringItemCollection();
InBlock.gif                    
if(this.IsTrackingViewState)
InBlock.gif                        _extFilters.TrackViewState();
ExpandedSubBlockEnd.gif                }

InBlock.gif                
return _extFilters;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif        
#endregion


至此上传控件中的所有主要元素已经分析清楚,下篇文章我将开始具体的开发工作

转载于:https://www.cnblogs.com/keyss/archive/2005/01/22/95788.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值