我试图在asp.net(4)中继承密码恢复控件,以便我可以覆盖OnVerifyingUser事件的行为,但是我在将子类密码恢复控件添加到页面时遇到了问题。我尝试创建一个asp:占位符控件并向其添加一个新的子类控件实例,但我得到一个错误,上面写着“具有相同键的条目已经存在”。我已尝试在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:一个条目 已经存在相同的密钥。
来源错误:
生成了未处理的异常 在执行当前 网络请求。有关的信息 异常的起源和位置 可以使用例外来识别 堆栈跟踪下面。
堆栈追踪:
[ArgumentException:带有的条目 同一把钥匙已经存在。]
System.Collections.Specialized.ListDictionary.Add(对象 键,对象值)+7952083
System.Web.UI.ClientScriptManager.RegisterExpandoAttribute(字符串 controlId,String attributeName, String attributeValue,Boolean encode) +337 System.Web.UI.ScriptRegistrationManager.RegisterExpandoAttribute(Control control,String controlId,String attributeName,String attributeValue, 布尔编码)+115
有谁知道为什么?我怀疑这与密码恢复控制的基类中的验证控件有关,但我对如何继续进行操作有点不知所措。
答案 0 :(得分:0)
检查aspx文件的其余部分以及designer.vb文件,看看是否已存在具有相同ID的控件。
或者,在将控件添加到页面(占位符)集合之前设置断点,并递归地询问页面控件以查看是否已存在具有相同ID的控件。
答案 1 :(得分:0)
不确定为什么这是一个问题,但最终我发现将控件的ClientID模式设置为AutoID解决了问题。我怀疑是控件生成的验证控件具有相互冲突的身份,但我无法证明它。