ASP.NET进阶(7):认清控件之DataBind

本文探讨了ASP.NET中的DataBind方法,以Repeater控件为例,阐述数据绑定的原理。在Page_Load事件中,DataBind()方法用于将数据源与控件关联。通过CreateItem方法生成ItemTemplate,并在RepeaterItem的DataBind中完成具体的数据绑定。文章还提及了嵌套数据绑定的处理,并对比了自定义模板引擎与WebForm的相似之处,强调重复造轮子对于深化理解的重要性。
摘要由CSDN通过智能技术生成

    数据绑定,databind()是多么亲切的方法,我们每天很不能敲上几百遍。但是你有木有想过他是如何实现的?有木有!!!(咆哮体:)今天,我们拿Repeater来说说DataBind那些事儿。如果朋友你有看过我写的模版引擎里Label的初级应用的话,我在最后贴了一个List的Label的实现,其中有点意思的就是模仿Repeater。不过看没看过无所谓的。今天我们看看微软人家正儿八经的Repeater。
    一般控件的绑定我们都是在Page_Load事件方法里这么写

if(!IsPostBack) 
{ 
    BindList(); 
} 
而BindList方法就是我们绑定控件用的方法,独立出来的目的是可能多处使用这个方法。很明显,我们一般都是这么绑定的。
public void BindList() 
{ 
    lst.DataSource = DataHelper.GetList(); 
    lst.DataBind(); 
}
那么,我们就根据咱们写的代码一看绑定的究竟。
第一步就是我们给DataSource成员赋值,看看赋值的时候发生了什么?
public virtual object DataSource 
{ 
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] 
    get 
    { 
        return this.dataSource; 
    } 
    set 
    { 
        if (((value != null) && !(value is IListSource)) && !(value is IEnumerable)) 
        { 
            throw new ArgumentException(SR.GetString("Invalid_DataSource_Type", new object[] { this.ID })); 
        } 
        this.dataSource = value; 
        this.OnDataPropertyChanged(); 
    } 
}
 
从上面的方法中我们可以看出DataSource还真不简单,一个赋值就干了很多事,其实get和set是两个方法(get_dataSource、set_dataSource),只是C#里这么写比较好看些。
如果我们指定的datasource不是IEnumerable(可迭代),不是IListSource类型,则抛出异常(参数错误:无效的数据源),说明肯定要用到IListSource的方法,而且要循环使用(Repeater肯定的循环啊)。
然后执行了OnDataPropertyChanged()的方法。看名字就能猜到该方法就是一个地下党,他会告诉类里面的某些成员说:“嘿,伙计,数据源变啦,各单位注意!”,这时候Repeater去获取数据的时候会问这个地下党:”哥们,现在风头紧不紧。。。“
protected virtual void OnDataPropertyChanged() 
{ 
    if (this._throwOnDataPropertyChange) 
    { 
        throw new HttpException(SR.GetString("DataBoundControl_InvalidDataPropertyChange", new object[] { this.ID })); 
    } 
    if (this._inited) 
    { 
        this.RequiresDataBinding = true; 
    } 
    this._currentViewValid = false; 
} 

第一句抛出异常就是”内部组织“决定杀人灭口,根本没机会了。第二句,_inited,是否初始化过,_currentViewValid,意思是当前的DataView是否验证过?(意思是这数据源来源不明啊)

第二句话就是执行DataBind()了,DataBind就会用到上面的”地下组织“。

public override void DataBind() 
{ 
    if ((!this.IsBoundUsingDataSourceID || !base.DesignMode) || (base.Site != null)) 
    { 
        this.RequiresDataBinding = false; 
        this.OnDataBinding(EventArgs.Empty); 
    } 
} 

就是说是否使用DataSourceID来绑定? 显然我们不是,我们直接给定的数据源。 如果指定了DataSourceID,在Render Repea
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值