ASP.NET TextBox (поле ввода HTML) заполняется именем пользователя автоматически при загрузке формы - PullRequest
2 голосов
/ 01 августа 2011

У меня есть элемент управления TextBox в форме, которая по-прежнему извлекает данные при отображении HTML-формы. Я попытался установить для AutoCompleteType значение «Нет», но я думаю, что он просто определяет, найдет ли он ранее введенные данные для этого поля, а не то, что фактически заполняет это поле ввода при загрузке страницы. Почему это текстовое поле будет тянуть данные? Это вызывает еще одну большую проблему. Этот TextBox находится внутри элемента управления (файл * .ascx). Он загружается из другого элемента управления динамически - не уверен, имеет ли это значение. Это происходит только в Mozilla Firefox. Когда я проверяю txtKeywords.Text в событии Page_Load элемента управления, который содержит TextBox, значение равно нулю. Таким образом, значение, очевидно, исходит из браузера, а не с сервера. Что вызвало бы это?

<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

После комментария Массимилиано Пелусо я не смог найти ни одного подозрительного JavaScript. Однако я заметил, что значение в этом поле ввода ВСЕГДА совпадает с идентификатором пользователя. Значение атрибута "gtbfieldid" в поле TxtUser всегда изменяется, когда я проверяю элемент в Firebug. Это поле TxtUser всегда отличается от нашего поля ввода txtKeywords. Они есть на разных страницах. И они, кажется, заполняются разными значениями каждый раз. Так что я не видел корреляции там. Я до сих пор не знаю, для чего этот атрибут. Этот атрибут не отображается в Internet Explorer, поэтому по какой-то причине его нужно вставить в Firefox.

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

Благодаря вкладу Джонни # 5 мы доказали, что сервер не устанавливал этот текст. Это не ответ на мой вопрос, но это было очень полезно. Я установил точку останова в сеттере, и она не была вызвана. Только получатель получил вызов. Чтобы прояснить ситуацию, это пользовательский элемент управления веб-сервера (файл .vb), НЕ ЗАМЕДЛЯЕТСЯ с пользовательским элементом управления (файл .ascx, файл * .ascx.vb и иногда * .ascx.Designer. файл .vb). Я добавил событие Render в этот класс. Мне также пришлось импортировать 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

На моей странице, где я реализую этот пользовательский элемент управления веб-сервера, мне нужно зарегистрировать этот класс.

<%@ 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> Параметры> Безопасность> Запомнить пароль, вызывающий проблему. Но я все еще в замешательстве. : - \

enter image description here

На компьютере, вызвавшем проблему, я продолжал устанавливать этот флажок и не мог заставить браузер задать мне вопрос: «Вы хотите, чтобы Firefox запомнил ваш пароль?» (не помню точную формулировку). Но на другом компьютере меня сразу спросили. И когда я нажал «Запомнить» и перешел на эту страницу, в этом поле ввода отображается «x» (он же веб-элемент управления TextBox). И мое имя пользователя, и пароль оба обозначены буквой "x", поэтому я не уверен, что именно он вытягивает. Несмотря на значение, которое он извлекает, мой виновник TextBox не имеет ни идентификатора (идентификатора пользователя, ни пароля) в качестве идентификатора. Следующий вопрос: как Firefox определяет, когда следует вводить имя пользователя и пароль? Одна интересная вещь в этой форме состоит в том, что в другом поле есть текстовое поле пароля, но у меня нет ИД пользователя в этой форме. Интересно, Firefox помещает имя пользователя в первое найденное поле ??

enter image description here

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

Ответ

Поэтому я вставил фиктивное поле в элемент управления SearchPanel и угадаю, где указано мое имя пользователя. Я читал по этой ссылке о Mozilla Password Manager, и, очевидно, Mozilla использует свой интеллект для определения лучшего места для размещения идентификатор пользователя (иногда упоминается как имя пользователя). В моем случае у меня есть метка для имени пользователя (не идентификатора пользователя) в моем элементе управления аутентификацией, но я не хочу поле идентификатора пользователя. Поскольку пользователь уже вошел в систему, он не должен вводить какой-либо идентификатор пользователя. Вот почему метка имени пользователя находится перед полем пароля. Мы проводим аудит изменений в нашем приложении, поэтому мы используем его в приложении.

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

Итак, я сделал тест для проверки функциональности Mozilla. Я поместил другое фиктивное поле после более старого виновного TextField (с идентификатором "txtKeywords", чтобы его размещение было последним полем ввода, предшествующим полю ввода пароля. И предположил, где Mozilla Firefox поместил идентификатор пользователя? Да, в фиктивном TextBox / input Когда я отключаю опцию «Запомнить пароль для сайтов» в 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>

enter image description here

Да, помещение в скрытое поле ввода решило проблему. Я полагаю, что я мог бы либо вставить TextBox, но я просто выбрал поле ввода с помощью runat = "server" ... поскольку CLR не нужно взаимодействовать с ним в ASP.NET. После этого «x» (идентификатор пользователя) исчез из поля ввода txtKeywords элемента управления SearchPanel. : -)

<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>

Ответы [ 5 ]

3 голосов
/ 09 июля 2012

Простое решение: установите для свойства автозаполнения текстового поля значение "off"

<asp:TextBox id="TxtPassword" Runat="server" Width="80" autocomplete="off" TextMode="Password"></asp:TextBox>
1 голос
/ 01 августа 2011

Если вы хотите узнать, установлен ли текст на стороне сервера, вы можете попробовать это:

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

Используйте это текстовое поле внутри своего пользовательского элемента управления вместо исходного, затем установите точку останова на установщике и проверьте стек вызовов, когда вы туда попали.

Примечания МакГайвера:

Добавление пояснений. Это НЕ отвечает на мой вопрос, но было ОЧЕНЬ полезно, чтобы доказать, что текст не был установлен на стороне сервера. Это пользовательский элемент управления веб-сервера (файл .vb), его не следует путать с пользовательским элементом управления (файл .ascx, файл * .ascx.vb и иногда файл * .ascx.Designer.vb) , Я добавил событие Render в этот класс. Мне также пришлось импортировать 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

Конечный класс

На моей странице, где я реализую этот пользовательский элемент управления веб-сервера, мне нужно зарегистрировать этот класс.

<%@ 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>
1 голос
/ 01 августа 2011

В жизненном цикле ASP.NET есть два события, которые отвечают за обслуживание данных после обратной передачи.Одним из них является LoadViewState, а другим является LoadPostBackData.Если элемент управления, который реализует интерфейс IPostBackDataHandler, загружается значениями из данных Http Post в событии LoadPostBackData.Элемент управления TextBox получает свое значение не из состояния просмотра, а из данных публикации в форме в этом событии.Таким образом, даже если вы отключите состояние просмотра для элемента управления TextBox, оно может получить свое значение из данных публикации HTTP, если оно реализует интерфейс IPostBackDataHandler.ниже:

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

0 голосов
/ 18 июля 2014

Скопируйте и вставьте приведенный ниже код в раздел заголовка страницы.

<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>
0 голосов
/ 04 августа 2011

Смотрите ответ на мой вопрос внизу.Это все объясняется.По сути, Mozilla Firefox Password Manager помещает идентификатор пользователя в последнее поле ввода, предшествующее сохраненному полю ввода (в зависимости от того, что хранится в Mozilla Firefox Password Manager).Так что я просто собираюсь поместить скрытое фиктивное поле (или поле ввода) внутри моего элемента управления аутентификацией, которое предшествует полю ввода моего пароля.

В этой статье есть одна цитата, которая как бы объясняет это, но я думаю, что у меня есть лучшее объяснение.

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

Цитата по ссылке выше: «Затем использует значения поля имени пользователя / поля пароля в качестве подсказок для поиска соответствующих элементов на веб-странице путем сопоставления их с атрибутом« имя »."

...