【问题标题】:ASP .NET OnClick Fires wrong server side methodASP .NET OnClick 触发错误的服务器端方法
【发布时间】:2018-03-06 20:37:07
【问题描述】:

简介:

我的登录页面有两种引导模式,一种用于注册新帐户,另一种用于登录现有帐户。间歇性地我看到一个问题,即尝试登录导致注册提交按钮的方法被触发,而不是登录按钮的方法(单击的那个)。

详情:

我将在必要时描述一些布局和发布代码。我试图避免发布大量代码,因为我不确定问题出在哪里。此页面是 site.master 的子页面,具有多个与主题和站点功能相关的 .css 和 .js 文件。

“signup-modal”模式包括几个输入字段,然后是提交按钮“Button1”,其 onclick 参数会触发代码隐藏文件 (C#) 中的服务器端“RegisterUser”方法。

'login-modal' 模式包括输入用户名/密码、记住我复选框、使用 facebook 按钮和提交按钮的登录,其 onclick 参数会触发文件背后代码中的服务器端 'ValidateUser' 方法(C# )。

每个模式都被一个 UpdatePanel 包围。

当用户打开登录模式并填写有效信息然后单击登录按钮时,它通常会按预期运行,触发“ValidateUser”方法,使用数据库检查信息并验证/将用户重定向到内容页面.但是,有时当单击登录按钮时,“RegisterUser”方法会触发,并在数据库告诉它输入的用户名已经存在时返回我编码的错误。

不幸的是,我似乎无法始终如一地重新创建此错误,但它似乎与身份验证有关。一旦用户数据库验证了用户身份,我就使用 FormsAuthentication 为用户设置身份验证 cookie。我注意到当这个错误发生时,如果缓存被清除,那么你就可以成功登录了。

我不明白为什么 Session 身份验证中的任何内容都会导致错误的方法触发 onclick。尤其是当它触发与它关联的按钮控件时,它是隐藏的并且应该是不可访问的。我能想到的最好的方法是,不知何故,所有 onclick 方法都被触发了,因为“RegisterUser”是 html 中的第一个,那就是正在执行的那个?

我的尝试:

我读过一些帖子,人们会因为空白标签而看到这种行为:

ASP.NET: Wrong event is fired when I click a LinkButton

我在我的代码中没有看到类似的内容,但是我在 ASP:Button 控件中确实有一个 class="" 调用,它生成了一个关于 class="" 不是有效参数的警告。我尝试删除它,但没有发现行为有任何变化。

我在两个表单(在每个模式中)都包含了必需的字段参数,当模式被隐藏或显示时,我删除/添加了 VIA javascript。我删除它的原因是,如果由于浏览器试图找到要验证的控件而没有看到它而隐藏了必填字段,则会引发错误。由于“RegisterUser”方法在浏览器未尝试验证关联字段的情况下触发,我可以推测该按钮实际上是隐藏的(删除了所需的参数),而不仅仅是屏幕外或其他什么。

我已尝试确定为什么这只是间歇性发生,但没有成功。这似乎不是由于一个用户名下经过身份验证的会话数。我已经在不同的计算机/浏览器上登录了超过 5 个会话而没有收到错误,并且它发生在用户第一次登录尝试时。

另外,我可以确认我在 Chrome、IE、Edge 和 Firefox 中都看到过这个错误,而且还是间歇性的。

我已经仔细检查了除了注册按钮的 onclick 函数之外,没有在其他任何地方调用“RegisterUser”方法。

我还没有找到任何其他类似的帖子,所以我绝望地转向你。

问题:

因此,如果您已经完成了所有这些,那么真正的问题是;什么会导致错误的 OnClick 方法触发?我有根据的猜测是否与会话身份验证有关?

我还希望能提供一些关于从哪里进行故障排除的建议。我可以根据需要发布代码 sn-ps,我只是不确定什么是相关的,并且考虑到我不想全部发布的代码量。

代码片段:

按钮:

注册按钮:

<asp:Button ID="Button1" runat="server" onclick="RegisterUser" Text="Create Account" CssClass="btn btn w-lg btn-rounded btn-lg btn-custom waves-effect waves-light" />

登录按钮:

<asp:Button ID="btnSubmit" runat="server" onclick="ValidateUser" Text="Sign In" CssClass="btn btn w-lg btn-rounded btn-lg btn-custom waves-effect waves-light" />

RegisterUser 方法概述

protected void RegisterUser(object sender, EventArgs e)
{
    /* Code that registers user with database if username doesn't exists */
}

ValidateUser 方法概述

protected void ValidateUser(object sender, EventArgs e)
{
    /* Code that validates user with the database and authenticates if valid. */
}

如果有更多信息有助于包含,请告诉我,我会更新问题。

非常感谢您。

更新

从来就发现̶I̶'̶m̶能够重现此错误100%̶当运行在本地主机,而不是开发̶s̶e̶r̶v̶e̶r̶.̶ (事实并非如此)

这是我似乎偶然发现的另一个奇怪行为。如果我输入用户名和密码,RegisterUser 方法就会触发。但是,如果用户名和密码由密码管理器填写,则会触发 ValidateUser 方法(正确操作)。

【问题讨论】:

    标签: c# asp.net authentication onclick session-cookies


    【解决方案1】:

    检查 .aspx 源中的按钮声明。

    如果您有一个 'runat=server' 和 onclick="RegisterUser",并且您的代码隐藏中有一个事件处理程序,它将导致该事件被触发两次。

    如果是这样,请尝试更改此设置

      <asp:Button ID="Button1" runat="server" onclick="RegisterUser" 
       Text="Create Account" CssClass="btn btn w-lg btn-rounded btn-lg btn-
       custom waves-effect waves-light" />
    

    到这里

       <asp:Button ID="Button1" runat="server" Text="Create Account" 
       CssClass="btn btn w-lg btn-rounded btn-lg btn-custom waves-effect 
       waves-light" />
    

    其他人说添加type="submit" 对他们有帮助。

    另一种情况可能是您在服务器端的事件处理程序可能导致事件被触发两次。

    例如,如果您有:

    Protected Sub RegisterUser_OnClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles RegisterUser_Click
    'Do Something
    

    结束子

    Handles RegisterUser_Click 可能会导致事件被触发两次。

    顺便说一句,很好的解释。希望最好。让我们知道是什么问题。祝你好运。

    【讨论】:

    • 感谢克里斯托的及时回复。删除 onclick 参数只会导致该特定按钮触发回发,而无需实际调用任何特定方法。我应该澄清一下,我在代码隐藏中使用的是 C#,而不是 VB。我将更新问题以包含 RegisterUser 方法,并考虑尝试 type="submit" 的想法。
    • 另外,请记住 RegisterUser 方法正在触发 ValidateUser 方法的 INSTEAD。我没有看到任何东西告诉我它正在发射两次。
    • 您在两种情况下使用的模态是否相同?如果您在没有先注册或其他任何操作的情况下立即打开模式登录,它仍然会触发错误的事件吗?
    • 两个独立的模态,有自己的输入字段,只打开登录模态并提交会产生所描述的行为。
    • 尝试断点。我在上面的代码中看不到任何错误。它必须是触发 registeruser 方法而不是 validateuser 触发的其他东西。
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2014-07-20
    • 2013-02-27
    相关资源
    最近更新 更多