【发布时间】: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>
<asp:TextBox id="TextBox1" runat="server" Width="125px" AutoCompleteType="None" AutoComplete="False"></asp:TextBox>
<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