UpdatePanel不适用于代码块

时间:2010-10-05 19:39:24

标签: ajax updatepanel

我使用像这样的

代码块来引用控件(rcbModels)
  function pageLoad() {

      models = $find("<%= rcbModels.ClientID %>");
  }

我在此页面中添加了一个UpdatePanel,但我总是收到以下错误: “无法修改Controls集合,因为控件包含代码块(即&lt;%...%&gt;)。”

我尝试将代码块更改为:

      function pageLoad() {

      models = $find("<%# rcbModels.ClientID %>");
  }

Pre_RenderComplete事件上的DataBinding没有成功。

解决此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

查看http://www.telerik.com/community/forums/aspnet/editor/the-controls-collection-cannot-be-modified-because-the-control-contains-code-blocks-i-e-lt-gt.aspx

似乎这可能是由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();       
}