【问题标题】:ASP.NET TextBox (HTML input field) populates with username automatically when form loadsASP.NET 文本框(HTML 输入字段)在表单加载时自动填充用户名
【发布时间】:2011-10-17 12:54:30
【问题描述】:

我在一个表单中有一个 TextBox 控件,当 HTML 表单呈现时它仍在提取数据。我尝试将 AutoCompleteType 设置为“无”,但我认为这只是控制它是否会找到以前为该字段输入的数据,而不是在页面加载时实际填充到该输入字段的内容。为什么这个文本框会提取数据?它引起了另一个更大的问题。此文本框位于控件(*.ascx 文件)内。它是从另一个控件动态加载的——不确定这是否重要。它只发生在 Mozilla Firefox 中。当我在包含 TextBox 的控件的 Page_Load 事件中检查 txtKeywords.Text 时,该值为 null。所以价值显然来自浏览器,而不是服务器。这是什么原因造成的??

<asp:TextBox id="txtKeywords" runat="server" Width="125px" AutoCompleteType="None" autocomplete="False"></asp:TextBox>

呈现的 HTML:

<input type="text" style="width: 125px;" autocomplete="False" id="ExplorerPageHtmlLeft_ctl01_txtKeywords" name="ExplorerPageHtmlLeft$ctl01$txtKeywords" gtbfieldid="77">

父控件代码后面(searchPanel1控件包含TextBox):

    Private Sub Page_Load(ByVal sender As Object, _
                          ByVal e As EventArgs) _
            Handles MyBase.Load
        navigation1 = CType(LoadControl("ExplorerNavigation1.ascx"), ExplorerNavigation1)
        searchPanel1 = CType(LoadControl("SearchPanel.ascx"), SearchPanel)
        navigation2 = CType(LoadControl("ExplorerNavigation2.ascx"), ExplorerNavigation2)

        Me.PlaceHolder1.Controls.Add(navigation1)
        Me.PlaceHolder1.Controls.Add(searchPanel1)
        Me.PlaceHolder1.Controls.Add(navigation2)
    End Sub

在 Massimiliano Peluso 发表评论后,我还没有找到任何可疑的 JavaScript。但是,我确实注意到此输入字段中的值始终与用户 ID 相同。当我在 Firebug 中检查元素时,TxtUser 字段上的“gtbfieldid”属性的值似乎总是发生变化。这个 TxtUser 字段总是与我们的 txtKeywords 输入字段不同。它们在不同的页面上。而且它们似乎每次都填充不同的值。所以我在那里没有看到相关性。我还是不知道这个属性是干什么用的。此属性在 Internet Explorer 中不显示,因此出于某种原因必须将其插入到 Firefox 中。

<input type="text" id="TxtUser" name="TxtUser" gtbfieldid="37">

感谢 Johnny #5 的输入,我们证明服务器没有设置此文本。这不是我问题的答案,但这非常有帮助。我在设置器中设置了一个断点,但它没有被调用。只有吸气剂被调用。澄清一下,这是一个自定义 Web 服务器控件(.vb 文件),不要与自定义用户控件(.ascx 文件、*.ascx.vb 文件,有时还有 *.ascx。 Designer.vb 文件)。我在这个类中添加了渲染事件。我还必须导入 2 个命名空间。 我想弄清楚的下一个方法是能够扩展浏览器在此字段中设置文本的能力(通过客户端),就像我们在下面为服务器端所做的那样。对于这类问题,这将是一种非常棒的方法。不确定 Firebug 是否有这种能力。我仍然不知道是什么设置了这个文本。所以我的问题还有待解决。

Imports System.Web
Imports System.Web.UI.WebControls

Public Class MyTextBox
    Inherits System.Web.UI.WebControls.TextBox

    Public Overrides Property Text() As String
        Get
            Return MyBase.Text
        End Get
        Set(ByVal value As String)
            MyBase.Text = value
        End Set
    End Property

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(writer)
    End Sub

End Class

在我实现这个自定义 Web 服务器控件的页面中,我需要注册这个类。

<%@ Register Assembly="Acu.LIMS.UI.Web" Namespace="Acu.LIMS.UI.Web" TagPrefix="MyTextBox" %>

<MyTextBox:MyTextBox id="txtKeywords" runat="server" Width="125px" AutoCompleteType="None" AutoComplete="False"></MyTextBox:MyTextBox>

好吧,我没疯!这不是服务器端代码,也不是导致此问题的客户端代码。这是Mozilla Firefox的>选项>安全>记住密码复选框导致问题。但我仍然很困惑。 :-\

在导致问题的计算机上,我一直在切换此复选框,但无法让浏览器问我“你想让 Firefox 记住你的密码吗?”这个问题。 (不记得确切的措辞)。但在另一台电脑上,我立即被问到。当我单击“记住”并转到该页面时,此输入字段(又名 TextBox Web 控件)中会显示“x”。我的用户名和密码都是“x”,所以我不确定它在拉哪个。尽管它提取了价值,但我的罪魁祸首 TextBox 没有 id(用户 id 或密码),因为它是 id。 下一个问题:Firefox 如何确定何时填写用户名和密码? 这个表单的一个有趣之处在于,另一个字段确实有密码文本框,但我在这个表单中没有用户 ID .我想知道 Firefox 是否将用户名放在它找到的第一个字段中??

=========================

回答

所以我在 SearchPanel 控件中输入了一个虚拟字段,并猜测我的用户名填写在哪里。我正在阅读有关 Mozilla 密码管理器的链接,显然 Mozilla 使用它的智能来确定放置用户 ID(有时称为用户名)。就我而言,我的身份验证控件中有一个用户名(不是用户 ID)标签,但我不想要用户 ID 字段。由于用户已经登录,他们不应该输入任何用户 ID。这就是为什么用户名标签位于密码字段前面的原因。我们审核应用程序中的更改,这就是将其包含在应用程序中的目的。

https://wiki.mozilla.org/Firefox%3aPassword_Manager

所以我做了一个测试来验证 Mozilla 的功能。我在旧的罪魁祸首 TextField 之后放置了另一个虚拟字段(ID 为“txtKeywords”,因此它的位置是密码输入字段之前的最后一个输入字段。猜猜 Mozilla Firefox 将用户 ID 放在哪里?是的,在虚拟 TextBox/输入中字段。当我关闭 Mozilla > 选项 > 安全性下的“记住站点密码”选项时,它不会填充,我的密码字段也不会填充。所以这就是我的答案。我想现在,我只会放一个我的身份验证控件中隐藏的 TextBox 字段,因此 Mozilla 会填充该字段,但不可见。

SearchPanel.ascx 控件:

<tr>
    <td nowrap class="categoryverticalNav">
        <asp:Label id="lblSearch" runat="server">Search</asp:Label><BR>
        <asp:DropDownList id="ddlCategory" runat="server" Width="164px"></asp:DropDownList><BR>
        <asp:TextBox id="txtKeywords" runat="server" Width="125px" AutoCompleteType="None" AutoComplete="False"></asp:TextBox>&nbsp;
        <asp:TextBox id="TextBox1" runat="server" Width="125px" AutoCompleteType="None" AutoComplete="False"></asp:TextBox>&nbsp;
        <asp:Button id="btnGo" runat="server" Width="28px" Text="Go" CausesValidation="False" />
    </td>
</tr>

是的,输入一个隐藏的输入字段解决了它。我想我也可以放入一个 TextBox,但我只是选择了一个带有 runat="server".. 的输入字段,因为 CLR 不需要在 ASP.NET 中与之交互。一旦我这样做了,“x”(用户 ID)就会从 SearchPanel 控件的 txtKeywords 输入字段中消失。 :-)

<td>
    <b><asp:Label ID="LblUserDisplayName" Runat="server" EnableViewState="False"></asp:Label></b>
</td>
<td>Password</td>
<td>
    <input runat="server" type="text" style="display:none;">
    <asp:TextBox id="TxtPassword" Runat="server" Width="80" EnableViewState="False" TextMode="Password"></asp:TextBox>
</td>

【问题讨论】:

  • 您对自动完成是正确的。如果我理解您的问题,问题是 TextBox 中的文本在回发之间持续存在。我是对的?
  • 我正在尝试确定它是否从回发中进入此表单。我不认为它是。在进入该表单之前,我单击带有此 href="/Explorer/ExplorerItem.aspx?id=108282&tableid=1994502930" 的超链接,这就是我最终访问的 URL。
  • 所以你点击那个链接,进入“ExplorerItem.aspx”,你的文本框已经填满了数据?
  • 我不知道你的项目中是否有任何可能影响文本框行为的 JS,但使用这种方法你肯定会修复它:-)
  • 吨!好主意..让我检查一下!

标签: asp.net firefox autocomplete textbox passwords


【解决方案1】:

将以下代码复制并粘贴到您的页面头部部分。

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script type="text/jscript">
$(document).ready(function () {
setTimeout(function () {
$("input[type='password'],input[type='text']").val('');
}, 50);
}); 

</script>

【讨论】:

    【解决方案2】:

    简单的解决方案:将文本框的自动完成属性设置为“关闭”

    <asp:TextBox id="TxtPassword" Runat="server" Width="80" autocomplete="off" TextMode="Password"></asp:TextBox>
    

    【讨论】:

    • 甜蜜!这样会覆盖浏览器设置?
    【解决方案3】:

    请参阅我的问题底部以获取答案。这一切都解释了。本质上,Mozilla Firefox 密码管理器将用户 ID 放置在存储的输入字段之前的最后一个输入字段中(基于 Mozilla Firefox 密码管理器中存储的内容)。因此,我将在密码输入字段之前的身份验证控件中放置一个隐藏的虚拟文本框(或输入)字段。

    这篇文章有一个可以解释它的引文,但我想我有一个更好的解释。

    https://wiki.mozilla.org/Firefox%3aPassword_Manager

    引用以上链接:
    “然后使用用户名字段/密码字段值作为提示,通过将它们与“名称”属性匹配来在网页中找到适当的元素。”

    【讨论】:

      【解决方案4】:

      如果你想查看文本是否设置在服务器端,你可以试试这个:

      public class MyTextBox : System.Web.UI.WebControls.TextBox
      {
            public override string Text
            {
               get
               {
                  return base.Text;
               }
               set
               {
                  base.Text = value;
               }
            }
      }
      

      在用户控件中使用此文本框而不是原来的文本框,然后在设置器上放置一个断点,并在到达那里时检查调用堆栈。

      MacGyver 的笔记:

      添加一些说明。这不能回答我的问题,但在证明文本没有在服务器端设置时非常有用。这是一个自定义 Web 服务器控件(.vb 文件),不要与自定义用户控件(.ascx 文件、*.ascx.vb 文件,有时还有 *.ascx.Designer.vb 文件)混淆)。我在这个类中添加了渲染事件。我还必须导入 2 个命名空间。

      导入 System.Web 导入 System.Web.UI.WebControls

      公共类 MyTextBox 继承 System.Web.UI.WebControls.TextBox

      Public Overrides Property Text() As String
          Get
              Return MyBase.Text
          End Get
          Set(ByVal value As String)
              MyBase.Text = value
          End Set
      End Property
      
      Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
          MyBase.Render(writer)
      End Sub
      

      结束类

      在我实现此自定义 Web 服务器控件的页面中,我需要注册此类。

      <%@ Register Assembly="Acu.LIMS.UI.Web" Namespace="Acu.LIMS.UI.Web" TagPrefix="MyTextBox" %>
      
      <MyTextBox:MyTextBox id="txtKeywords" runat="server" Width="125px" AutoCompleteType="None" AutoComplete="False"></MyTextBox:MyTextBox>
      

      【讨论】:

      • 我花了一点时间才弄清楚如何实现这一点。对于那些阅读,这称为自定义 Web 服务器控件。我在 Johnny 的答案中添加了更多信息,以实现调试目的。这没有回答我最初的问题,但我确实确认文本不是从服务器端设置的!
      • 它调用的是get,而不是set。
      • 很高兴它对您有所帮助。顺便说一句,如果你编写了许多这种类型的控件,或者通过实现System.Web.UI.WebControls.WebControl(不确定是否是这样......),你可以在你的 web.config 中添加一个指令,这样你就不必注册所有 aspx/ascx 中的命名空间。我现在可以忘记这个指令,但它应该很容易找到......
      • 是的,我在我发现的文章中读到了这一点......非常整洁的东西
      【解决方案5】:

      在 ASP.NET 生命周期中,有两个事件负责在回发后维护数据。一个是 LoadViewState,另一个是 LoadPostBackData。如果实现 IPostBackDataHandler 接口的控件被 LoadPostBackData 事件中的 Http Post 数据的值加载。 TextBox 控件的值不是从视图状态中获取的,而是从该事件中表单中的发布数据获取的。因此,即使您禁用 TextBox 控件的视图状态,如果它实现了 IPostBackDataHandler 接口,它也可以从 HTTP 发布数据中获取其值。

      If Page.IsPostBack(){
           yourTextBox.Text=string.empty;
      }
      

      http://forums.asp.net/t/1104194.aspx/1

      还请看以下内容:

      http://www.codeproject.com/KB/aspnet/ASPViewStateandPostBack.aspx

      【讨论】:

      • 有多个嵌套控件,但我没有看到在其中任何一个上实现了该接口。我必须在哪里明确设置 TextBox 控件等于 String.Empty?即使我这样做了,我也不确定这是否会有所帮助,除非它发生在 Page_Load 之后的事件中。但我认为所有浏览器都会发生这种情况,不是吗?这似乎是一个浏览器问题,因为它只发生在 Mozilla Firefox 中。
      • 我不知道您的代码,因为您没有发布所有代码。如果文本框在用户控件中,您可以在该用户控件上创建一个名为 InitializeTextBox() 之类的方法,该方法可以正常工作,您可以从页面加载或需要初始化它的任何地方调用它
      猜你喜欢
      • 2019-07-27
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2016-05-11
      • 2013-04-29
      • 1970-01-01
      • 2013-03-20
      相关资源
      最近更新 更多