我使用像这样的
代码块来引用控件(rcbModels) function pageLoad() {
models = $find("<%= rcbModels.ClientID %>");
}
我在此页面中添加了一个UpdatePanel,但我总是收到以下错误: “无法修改Controls集合,因为控件包含代码块(即&lt;%...%&gt;)。”
我尝试将代码块更改为:
function pageLoad() {
models = $find("<%# rcbModels.ClientID %>");
}
Pre_RenderComplete事件上的DataBinding没有成功。
解决此问题的最佳方法是什么?
答案 0 :(得分:0)
似乎这可能是由head标签中的runat =“server”引起的。将javascript代码移动到正文中但仍在更新面板之外可以解决此问题。
答案 1 :(得分:0)
对于简单的情况(普通页面,容器链到rcbModels
永不改变,代码质量不是问题),将rcbModels.ClientId
硬编码到脚本块中可以节省时间并完成工作。
function pageLoad()
{
models = $find("panelX_containerY_rcbModels");
}
在其他情况下,生成一个页面范围的客户端字典,其中包含映射到客户端ID的控件ID。
protected void Page_PreRender(object sender, EventArgs e)
{
ScriptManager.RegisterClientScriptBlock(this, typeof(YourPageClass),
"__BehaviorIds", String.Format(CultureInfo.InvariantCulture, @"
var __BehaviorIds = {{
rcbModels: '{0}',
anotherControl: '{1}',
yetAnotherControl: '{2}'
}};",
rcbModels.ClientID,
anotherControl.ClientID,
yetAnotherControl.ClientID), true);
}
然后,您可以在客户端按名称访问行为ID。
function pageLoad()
{
models = $find(__BehaviorIds.rcbModels);
anotherControl = $find(__BehaviorIds.anotherControl);
yetAnotherControl = $find(__BehaviorIds.yetAnotherControl);
}
答案 2 :(得分:0)
感谢您的回复。我最终做的是改变“#”为“#”并在后面的代码中添加一个DataBind()子句并解决了它。
function pageLoad() {
models = $find("<%# rcbModels.ClientID %>");
}
protected void Page_Load(object sender, EventArgs e)
{
Page.Header.DataBind();
}