我真的应该*调用DataBind()吗?

时间:2013-01-24 23:19:55

标签: c# asp.net data-binding lifecycle

我有一个CustomControl,当在页面上使用时,需要将服务器端值作为属性。我试过这个......

<MyControl runat="server"
           ID="MyControl1"
           ContainerId="<%= this.ClientID %>" />

现在,在运行时(为了解释这个问题,假设我知道this.ClientID的值是“ctl00_MyControl1”)如果我测试ContainerId它的客户端值回复为“&lt;%= this.ClientID%&gt;”。

如果没有真正了解原因,我试过这个......

<MyControl runat="server"
           ID="MyControl1"
           ContainerId="<%# this.ClientID %>" />

但是测试ContainerId的值显示该值为空!

更多阅读让我看到&lt;%#%&gt;机制是用于数据绑定,但很明显,我的控件没有这样做(假设我的CustomControl继承自TextBox)。

因此,我向DataBind()添加了对我的CustomControl所包含的UserControl的OnLoad事件的调用。

耶!有效。但是,在页面上处理某些事件时,对DataBind()的调用会生成异常。例外是在另一个控件中,与MyControl1包含在同一个UserControl容器中。

消息是

Selection out of range
Parameter name: value

并且堆栈跟踪完成如下......

   at Telerik.Web.UI.RadComboBox.PerformDataBinding(IEnumerable dataSource)
   at Telerik.Web.UI.RadComboBox.OnDataSourceViewSelectCallback(IEnumerable data)
   at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
   at Telerik.Web.UI.RadComboBox.OnDataBinding(EventArgs e)
   at Telerik.Web.UI.RadComboBox.PerformSelect()
   at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
   at Telerik.Web.UI.RadComboBox.DataBind()
   at System.Web.UI.Control.DataBindChildren()
   at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
   at System.Web.UI.Control.DataBind()

现在,我正在寻找此异常的解决方案;我已将其包含在内,以证明我认为我的来电DataBind()不一定是正确的做法。

所以,问题:

  1. 为什么不&lt;%=%&gt;在运行时给出我期望的值?
  2. 每当UserControl的DataBind()事件触发正确的操作以在运行时获取我的值时调用OnLoad,如果是,
  3. 在致电DataBind()
  4. 之前,我应该检查一下条件吗?

1 个答案:

答案 0 :(得分:1)

"`<%= this.ClientID %>`"  
在渲染时调用

,此时尚未设置ClientID

"`<%# this.ClientID %>`" 
在控件或页面DataBind()期间调用

。 如果您打算使用最后一个,那么您应该确实调用DataBind()并修复您的异常。