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

本文关键字:DataBind 调用 真的 我应该 | 更新日期: 2023-09-27 17:56:01

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

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

现在,当我运行时(为了这个解释,假设我知道this.ClientID的值是"ctl00_MyControl1"),如果我测试ContainerId的值,客户端,它会返回为"<%= this。客户端 ID %>"。

在不真正理解为什么的情况下,我尝试了这个...

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

但是测试ContainerId的值表明该值为空!

更多的阅读使我能够看到 <%# %> 机制用于数据绑定,但显然,我的控件没有这样做(假设我的自定义控件继承自 TextBox)。

因此,我添加了一个调用,以DataBind()包含我的自定义控件的用户控件的OnLoad事件。

耶!成功了。但是,在处理页面上的某些事件时,对DataBind()的调用会生成异常。异常位于另一个控件中,该控件包含在与 MyControl1 相同的用户控件容器中。

消息是

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. 为什么 <%= %> 在运行时没有给出我期望的值?
  2. 每当 UserControl 的 OnLoad 事件触发时调用DataBind(),以在运行时获取我的值,如果是,
  3. 在打电话之前,我应该检查DataBind()

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

"`<%= this.ClientID %>`"  

在渲染时调用,此时尚未设置ClientID

"`<%# this.ClientID %>`" 

在控件或页面DataBind()期间调用。如果你打算使用最后一个,那么你确实应该调用DataBind()并修复你的异常。