将子类密码恢复控制添加到页面会导致“已存在具有相同密钥的条目”。错误

时间:2011-05-06 15:13:03

标签: asp.net vb.net asp.net-membership subclassing password-recovery

我试图在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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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