跨页回发后Control.UniqueID不同

Posted

技术标签:

【中文标题】跨页回发后Control.UniqueID不同【英文标题】:Control.UniqueID different after cross-page postback 【发布时间】:2012-10-27 23:54:56 【问题描述】:

我有一个带有 MasterPage 的简单 ASP.NET 页面。在 MasterPage 中,我有两个登录字段:

<input type="text" runat="server" id="txtUserName"/>
<input type="text" runat="server" id="txtPassword"/>

当控件呈现到页面时,ASP.NET 呈现以下内容:

<input type="text" runat="server" id="ctl00_txtUserName" name="ctl00$txtUserName"/>
<input type="text" runat="server" id="ctl00_txtPassword" name="ctl00$txtPassword"/>

如果我理解正确,name 属性对应于控件的UniqueID 属性。但是,当我调试Page_Load 并尝试查看这些字段的UniqueID 时,它们具有不同的值(分别为ctl0$txtUserNamectl0$txtPassword)!

请注意,这似乎并不是所有使用此 MasterPage 的页面都存在的问题。它们中的大多数都可以正常工作并在渲染和Page_Load 中使用ctl0$txtUserNamectl0$txtPassword

知道什么可能导致 ASP.NET 为控件呈现不同于 Page_Load 中使用的 UniqueID 吗?

【问题讨论】:

【参考方案1】:

我仍然不确定是什么导致 MasterPage 中生成的 UniqueID 在 Page_Load 中与呈现到页面时不同。但是,我能够通过将这些字段的 UniqueID 存储在隐藏字段中来解决这个问题。然后我可以直接访问 Request.Form 集合中的值。

换句话说,我是这样做的:

在母版页中 -

<input type="text" runat="server" id="txtUserName"/>
<input type="text" runat="server" id="txtPassword"/>

<input type="hidden" id="txtUserNameUID" value="<%=txtUserName.UniqueID%>"/>
<input type="hidden" id="txtPasswordUID" value="<%=txtPassword.UniqueID%>"/>

在子页面的Page_Load期间-

string username = Request.Form[Request.Form["txtUserNameUID"]];
string password = Request.Form[Request.Form["txtPasswordUID"]];

希望这可以帮助其他在 ASP.NET 中遇到 UniqueID 怪异问题的人!

【讨论】:

【参考方案2】:

我刚刚意识到的奇怪的怪癖:运行在服务器上的任何包装控件也必须具有 ID。例如,如果您在控件周围有一个面板,即无论“ctl00”是什么,都必须为其分配一个 ID。如果未设置,则会分配一个,并且可以更改。

【讨论】:

以上是关于跨页回发后Control.UniqueID不同的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net jQuery $.getJSON 有时会导致整页回发?

单击面板会导致异步回发,但单击子项会导致整页回发

关闭子模态窗体后父页回发的问题

回发后丢失 Bootstrap CSS

回发后jQuery将DatePicker日期文本保留到文本框中

回发后jquery datepicker不起作用