【问题标题】:Accessing ClientID breaks the postback访问 ClientID 会中断回发
【发布时间】:2009-09-10 18:25:43
【问题描述】:

有时我在使用 ASP.Net 时会感到绝望 - 另一个不应该的问题!

在 Web 表单上有一个 ASP 表。在 ASP 表中有一个用户控件,我正在对其进行一些更改。在 ASP 表中有一个文本框....到目前为止没有任何异常!

在后面的代码中,作为 Page_Load 的一部分,我需要访问文本框的 ClientID 以注册一些 javascript...所以我这样做了,而 javascript 似乎可以完成它需要做的一切。大家都很开心。

不,不,显然每个人都不高兴,ASP.Net 本身很不高兴!

在访问 ClientID 时,源中出现的 id 是:

myControl_myTextBox

注释掉访问 ClientID 的行意味着 id 呈现为:

ctl00_BodyPlaceHolder_myControl_myTextBox

访问 ClientID 的行如下所示:

jsBuilder.AppendFormat(@"var filter = new TBFilter($(""#{0}"")[0]);", myTextBox.ClientID);

这本身并不困扰我,但它打破回发的事实,确实如此!如果您在该文本框中输入内容并点击提交按钮(页面上有一个提交按钮!),它会重新加载页面,但会将默认值放回文本框中并完全忽略您最初拥有的内容。疯狂 - 我没有做过任何特别奇怪和不寻常的事情,为什么它会破坏回发?

【问题讨论】:

  • 如果我理解正确的话,文本框的 ClientID 属性最初是 ctl00_BodyPlaceHolder_myControl_myTextBox 但在回发后,ClientID 现在是文本框的 myControl_myTextBox?
  • 不抱歉,如果我访问 ClientID 属性,id 会出现 myControl_myTextBox,但如果我注释掉该行,id 会出现 ctl00_BodyPlaceHolder_myControl_myTextBox - 我将编辑问题以反映这一点
  • jsBuilder.AppendFormat(@"var filter = new TBFilter($(""#{0}"")[0]);", myTextBox.ClientID);
  • @IP - 如果您只是将 JavaScript 放入页面并使用 var filter = new TBFilter($("#")[0]); 会发生什么你仍然得到相同的结果吗?

标签: asp.net controls page-lifecycle


【解决方案1】:

您在页面加载中注册的 javascript,是否会在回发中发生不应该发生的事情?如果是这样,您应该检查Page.IsPostback 以控制何时使用它。

您还应该注意,在页面生命周期中,Page_Load 发生在任何控件回发事件(例如按钮上的Click 事件)之前。因此,如果您注册的 javascript 代码取决于 Click 事件的结果,您应该在 Click 事件中注册它(如果它应该只在单击该按钮时发生),或者 Page_PreRender 事件(如果它应该总是发生)。

编辑:
也可能是在 Page_Load 之后对客户端 ID 的创建方式进行了一些更改。最好在 Page_PreRender 事件中执行此操作,以确保所有内容都已完成加载。

【讨论】:

  • 我已将其移至 Page_PreRender 中,这似乎解决了问题。仍然不认为这应该是一个问题!
猜你喜欢
  • 2011-08-12
  • 2017-05-22
  • 2013-09-05
  • 2011-12-14
  • 2023-03-07
  • 1970-01-01
  • 2013-06-03
  • 2021-07-25
  • 2018-01-18
相关资源
最近更新 更多