1

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

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

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

在没有真正理解原因的情况下,我尝试了这个......

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

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

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

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

耶!有效。但是,在处理 Page 上的某些事件时,对 的调用会DataBind()产生异常。异常发生在另一个控件中,该控件包含在与 相同的 UserControl 容器中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. DataBind()每当 UserControl 的OnLoad事件触发正确的事情以在运行时获取我的值时调用,如果是,
  3. 在打电话之前我应该​​检查哪些条件DataBind()
4

1 回答 1

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

在渲染时调用并且当时ClientID尚未设置。

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

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

于 2013-01-24T23:43:02.237 回答