我应该*真的*调用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()
不一定是正确的事情。
所以,问题:
- 为什么 <%= %> 在运行时没有给出我期望的值?
- 每当 UserControl 的
OnLoad
事件触发时调用DataBind()
,以在运行时获取我的值,如果是, - 在打电话之前,我应该检查
DataBind()
"`<%= this.ClientID %>`"
在渲染时调用,此时尚未设置ClientID
。
"`<%# this.ClientID %>`"
在控件或页面DataBind()
期间调用。如果你打算使用最后一个,那么你确实应该调用DataBind()
并修复你的异常。