0

我正在尝试对 asp.net (4) 中的密码恢复控件进行子类化,以便我可以覆盖 OnVerifyingUser 事件的行为,但我无法将子类密码恢复控件添加到页面中。我尝试创建一个 asp:placeholder 控件并向其中添加我的子类控件的新实例,但我只是收到一条错误消息,提示“已存在具有相同键的条目”。我尝试在 page_init 和 page_load 方法中执行此操作,但得到相同的错误。

这是我的子类的一个例子

Partial Class MyPasswordReminder
    Inherits PasswordRecovery

    Protected Overrides Sub OnVerifyingUser(e As System.Web.UI.WebControls.LoginCancelEventArgs)
        MyBase.OnVerifyingUser(e)
        'Do my stuff here
    End Sub

End Class

这就是我将它添加到页面的方式。

 Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
   Dim passwordRecoveryControl As New MyPasswordReminder
   passwordRecoveryControl.ID = "passwordRecoveryControl1"
   Placeholder1.Controls.Add(passwordRecoveryControl)
 End Sub

UI代码很简单:

<asp:Panel runat="server" ID="pnlMakeDefault" >
  <asp:Placeholder ID="Placeholder1" runat="server"/>
</asp:Panel>

在运行时我收到以下错误:

DefaultSource 错误:2:已存在具有相同键的条目。已存在具有相同键的条目。

完整错误:

已存在具有相同键的条目。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:已存在具有相同键的条目。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[ArgumentException: 已存在具有相同键的条目。]
System.Collections.Specialized.ListDictionary.Add(Object key, Object value) +7952083
System.Web.UI.ClientScriptManager.RegisterExpandoAttribute(String controlId, String attributeName, String attributeValue,布尔编码)+337 System.Web.UI.ScriptRegistrationManager.RegisterExpandoAttribute(控制控件,字符串 controlId,字符串属性名,字符串属性值,布尔编码)+115

有谁知道为什么?我怀疑这与密码恢复控件的基类中的验证控件有关,但我对如何进行有点不知所措。

4

2 回答 2

0

不完全确定为什么这是一个问题,但最终我发现将控件的 ClientID 模式设置为 AutoID 解决了这个问题。我怀疑该控件生成了具有冲突身份的验证控件,但我无法证明这一点。

于 2011-05-09T15:04:31.203 回答
0

检查 aspx 文件的其余部分以及 designer.vb 文件,看看是否已经存在具有相同 ID 的控件。

或者,在将控件添加到页面(占位符)集合之前设置一个断点,并递归地询问页面控件以查看是否已经存在具有相同 ID 的控件。

于 2011-05-06T17:28:38.923 回答