当前位置: 首页 > 面试题库 >

无法获取嵌套在UpdatePanel中的WebControl中的ScriptManager.RegisterStartupScript

红明德
2023-03-14
问题内容

我遇到了我认为应该是一个非常简单的问题,但是对于我的一生,我看不到我的问题。问题与ScriptManager.RegisterStartupScript有关,我之前已经使用过多次。

我遇到的情况是,我已经将一个自定义Web控件插入到页面中。控件(和一个或两个其他控件)嵌套在UpdatePanel中。它们被插入到页面上的PlaceHolder上:

<asp:UpdatePanel ID="pnlAjax" runat="server">
  <ContentTemplate>
    <asp:PlaceHolder ID="placeholder" runat="server">
    </asp:PlaceHolder>
    ...

protected override void OnInit(EventArgs e){
  placeholder.Controls.Add(Factory.CreateControl());
  base.OnInit(e);
}

这是页面上唯一的更新面板。

该控件需要运行一些初始javascript才能正常运行。该控件调用:

ScriptManager.RegisterStartupScript(this, GetType(), 
                                    Guid.NewGuid().ToString(), script, true);

我也尝试过:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), 
                                    Guid.NewGuid().ToString(), script, true);

问题在于该脚本在首次显示页面时可以正确运行,但是在部分回发后不会重新运行。我尝试了以下方法:

  1. 从CreateChildControls调用RegisterStartupScript
  2. 从OnLoad / OnPreRender调用RegisterStartupScript
  3. 对于前两个参数使用不同的参数组合(在上面的示例中,控件是Page,类型是GetType(),但我尝试使用控件本身,等等)。
  4. 我尝试使用持久性ID和新ID(不是我认为这对两种方式都会产生重大影响)。
  5. 我已经使用了几个断点,因此已经验证了Register行是否被正确调用。

我没有尝试过的唯一一件事就是使用UpdatePanel本身作为控件和类型,因为我不认为控件应该知道更新面板(在任何情况下,似乎都不是获取更新的好方法面板?)。

有人可以看到我在上面可能做错了什么吗?

谢谢 :)

好吧,要回答上面的查询-确实好像占位符弄乱了ScriptManager.RegisterStartupScript。

当我将控件从占位符中拉出并直接将其编码到页面上时,Register脚本正常工作(我也将控件本身用作参数)。

ScriptManager.RegisterStartupScript(this,GetType(),Guid.NewGuid()。ToString(),script,true);

谁能解释为什么向PlaceHolder注入控件会阻止ScriptManager正确注册脚本?我猜想这可能与动态控件的生命周期有关,但是(据我所知)如果有上述正确的过程,我将不胜感激。


问题答案:

我认为您确实应该使用RegisterStartupScript 的Control重载。

我在服务器控件中尝试了以下代码:

[ToolboxData("<{0}:AlertControl runat=server></{0}:AlertControl>")]
public class AlertControl : Control{
    protected override void OnInit(EventArgs e){
        base.OnInit(e);
        string script = "alert(\"Hello!\");";
        ScriptManager.RegisterStartupScript(this, GetType(), 
                      "ServerControlScript", script, true);
    }
}

然后在我的页面中,我有:

protected override void OnInit(EventArgs e){
    base.OnInit(e);
    Placeholder1.Controls.Add(new AlertControl());
}

其中Placeholder1是更新面板中的占位符。占位符上还有几个其他控件,包括按钮。

这的行为完全符合您的预期,每次加载页面或导致更新面板更新时,我都会收到一条警告,说“ Hello”。

您可能要查看的另一件事是挂接到在更新面板请求期间触发的某些页面生命周期事件:

Sys.WebForms.PageRequestManager.getInstance()
   .add_endRequest(EndRequestHandler);

该PageRequestManager endRequestHandler事件触发每一个更新面板完成其更新时间-这将让你调用一个方法来建立你的控制。

我唯一的其他问题是:

  • 您的脚本实际上在做什么?
  • 大概您可以在页面底部的HTML中看到脚本(恰好在


 类似资料:
  • 问题内容: 按钮1位于更新面板之外,当用户在上传框中添加文件时运行的javascript是这样的: 问题很简单。 FileUpload1.HasFile ==否。我不知道为什么会这样,但是当我将其放在更新面板中时,它将停止工作。 我已经看到了其他一些线程。但是他们都没有回答为什么会发生这种情况,他们只是指向您可以下载的内容。 编辑:确实,我想要这样做的主要原因是,我可以获取一个..Uploadin

  • 问题内容: 我有两个结构: 它代表我的自定义PostgreSQL对象类型(我自己创建): 下一个结构是DB中的表: 我的自定义对象嵌套在Client类型中,名为。我尝试通过以下方式读取数据: 但不幸的是,我无法读取字段(具有默认值)。我不想使用google_account创建单独的表,也不希望将此结构作为客户端表中的单独字段或将其打包为json(创建单独的实体,因为该结构不仅在此表中使用,而且我正

  • 我需要一些关于我遇到的一些问题的帮助,当尝试连接到redis使用spring Boot。 我正在使用以下重新配置: 和下面的类,我正在尝试创建一个单元测试来测试我的连接: 我知道这里有一个类似的问题,但我还没有要求的分数来评论,我尝试了他们的建议,我仍然得到同样的结果。下面是我的pom.xml: 下面是我的属性文件: redis.clients.jedis.exceptions.jedisconn

  • 问题内容: 我已经通过像许多环节去Jedis,无法获取jedis连接:无法从池中获取资源,并不能得到Jedis连接; 无法从池中获取资源,但仍收到以下错误。 我 在Spring Batch中 使用 Spring Data Redis, 并从mysql读取数据并写入 Redis DB。似乎有些连接错误。 下面的错误供参考。 我正在使用以下简单配置。 问题答案: 我在这里发布了答案:无法在10.XX.

  • 我试图建立一个方面的导航使用elasticsearch为一个电子商务网站。 商店产品可以有多个变体。我想到的文档结构如下所示: 我将变体定义为嵌套类型。这样,以下查询将返回包含匹配筛选器的变体的所有文档: 现在,我真的希望获得与过滤器匹配的变体的id,以便在类别页面上显示该产品的变体。因此,在本例中,我希望返回第二个变量(1_b)的id。我只获取ResultSet中返回的文档的id。有什么方法可以

  • 如何聚合一个值在嵌套在Elasticsearch嵌套位置?我对一个嵌套对象没有问题,但在嵌套对象内的嵌套我感到困惑... 样本数据: 欲望结果: 在索引映射中,我将cat_a和条目字段的类型设置为嵌套,当我从工具字段查询聚合时,在cat_a的根(级别1)中没有问题,并且可以工作,但是在聚合中在rx_a(这是在第2级)我不能检索结果,它或空或显示错误,因为我的错误查询。 查询级别1 agg: 如何处