ASP: значение TextBox исчезает в постбэке только тогда, когда пароль

У меня есть текстовое поле asp.net, подобное этому:

 <asp:TextBox ID="PINPad" runat="server" Columns="6" MaxLength="4" 
      CssClass="PINTextClass"></asp:TextBox>

Как вы могли догадаться, это текстовое поле экранной панели PIN-кода. Javascript заполняет значения. Страница обновляется каждые пять секунд (с использованием панели обновлений, если это имеет значение), чтобы обновить различные другие несвязанные элементы на экране. Это прекрасно работает.

Однако, когда я конвертирую его в текстовое поле пароля, например:

  <asp:TextBox ID="PINPad" runat="server" Columns="6" MaxLength="4" 
       CssClass="PINTextClass" TextMode="Password"></asp:TextBox>

Затем всякий раз, когда страница отправляет обратно, текстовое поле очищается на экране, а текстовое поле пусто (хотя во время события таймера значение возвращается на сервер).

Любые предложения, как исправить это, чтобы оно сохраняло свое значение во время обратной передачи?


person JessicaB    schedule 30.01.2010    source источник
comment
Существует статья о том, как решить эту проблему более безопасно (если не идеально) по адресу codeproject.com/Articles/18927/   -  person Mark    schedule 26.10.2012


Ответы (3)


В качестве функции безопасности ASP.NET пытается запретить отправку значения пароля обратно клиенту. Если вы согласны с проблемами безопасности (т. е. это либо не очень защищенная информация, либо вы уверены, что соединение защищено), вы можете вручную установить атрибут "value" элемента управления, а не использовать его свойство Text. Это может выглядеть примерно так:

this.PINPad.Attributes.Add("value", this.PINPad.Text);
person bdukes    schedule 30.01.2010

вот еще один способ сделать это: -

using System;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebControlLibrary
{
    public class PWDTextBox : TextBox
    {
        public PWDTextBox()
        {
            this.TextMode = TextBoxMode.Password;
        }

        public string Password
        {
            get
            {
                string val = (string)ViewState["pwd"];
                if (string.IsNullOrEmpty(val))
                {
                    return "";
                }
                else
                {
                    return val;
                }
            }
            set
            {
                ViewState["pwd"] = value;
            }
        }

        public override string Text
        {
            get
            {
                return Password;
            }
            set
            {
                Password = value;
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            this.Text = Password;
        }

        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute(HtmlTextWriterAttribute.Value, this.Password);
        }
    }
}
person Hugh Gallagher    schedule 23.12.2013

Проблему потери пароля при обратной передаче можно избежать, используя асинхронные вызовы JavaScript, давайте опишем типичный сценарий для страницы входа:

Допустим, у нас есть страница входа, которая позволяет пользователю изменять язык своих меток, когда пользователь выбирает язык с помощью раскрывающегося списка.

введите здесь описание изображения

решением было бы вызвать событие selectedIndexChanged выпадающего списка, сделать обратную передачу, которая идет на сервер и подбирает метки на выбранном языке.

в этом случае пароль поля будет потерян из-за функции безопасности ASP.NET, которая делает поля паролей не сохраняемыми между обратными передачами.

Этот сценарий можно решить, если избежать обратной передачи, используя асинхронную технологию JavaScript и вызовы XML (Ajax).

Добавьте функцию javascript, которая будет вызываться из элемента управления раскрывающегося списка, в этом случае эта функция назначается свойству Command раскрывающегося списка в коде:

function ValueChanged(div) 
            {
                var table = div.getElementsByTagName("table");
                if (table && table.length > 0) 
                {
                    var t = table[0].getAttribute('type'); 
                    if (t != null && (t == "DropDown"))
                    {
                        var inputs = div.getElementsByTagName("input");
                        if (inputs && inputs.length == 2) 
                        {

                            {
                                Translate(inputs[1].value);
                            }
                        }
                    }
                }
            }

Функция Translate принимает в качестве параметра язык, выбранный в раскрывающемся списке, и выполняет асинхронный вызов, как показано ниже.

function Translate(lang)
            {
                var request = null;
                if (window.XMLHttpRequest) 
                {
                    request = new XMLHttpRequest();
                    if (request.overrideMimeType)
                    {                        
                        request.overrideMimeType('text/xml');
                    }
                }
                else if (window.ActiveXObject)
                {
                    request = new ActiveXObject("Msxml2.XMLHTTP");
                }
                if (request == null)
                {
                    return;
                }
                var url = "GetLoginTranslations.aspx";               
                request.open('GET', url +'?lang=' + lang, true);
                request.setRequestHeader("Cache-Control", "no-cache");
                request.setRequestHeader("Pragma", "no-cache");
                request.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
                request.onreadystatechange = function () { TranslateLabels(request); };
                request.send(null);
            }

показанная выше функция Translate выполняет вызов и получает результаты на указанной странице .aspx (в данном случае «GetLoginTranslations.aspx»)

когда запрос будет завершен и для request.onreadystatechange будет задана функция TranslateLabels, эта функция будет выполнена.

таким образом, обратная передача не выполняется, как раньше, в событии onSelectedIndexChanged элемента управления раскрывающимся списком.

функция TranslateLabels будет выглядеть примерно так:

function TranslateLabels(request) 
            {                
                if (request.readyState == 4) 
                {
                    if (request.status == 200) 
                    {
                        if (request.responseXML)
                        {
                            var objRoot = request.responseXML.documentElement;
                            if (objRoot)
                            {
                                if (objRoot.nodeName == "strings")
                                {
                                    for (var i = 0; i < objRoot.childNodes.length; i++) 
                                    {
                                        var node = objRoot.childNodes[i];
                                        var elem;
                                        switch (node.getAttribute("id"))
                                        {
                                            case "lbl_login": 
                                                elem = document.getElementById("lbl_login");
                                                if (elem)
                                                    elem.innerHTML = node.firstChild.nodeValue;
                                                break;
                                         }
///....
}
}
}
}
}
}

request.responseXML содержит XML, созданный на странице GetLoginTranslations.aspx, и там определяется структура этого XML.

событие Page_Load() в GetLoginTranslations.aspx должно выглядеть так:

protected void Page_Load(object sender, EventArgs e)
        {
  if (Request["lang"] != null)
                strLang = Request["lang"];

            //init response
            Response.Clear();
            Response.Cache.SetExpires(DateTime.Now);
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetValidUntilExpires(true);
            Response.ContentType = "application/xml";
            Response.Charset = "utf-8";


            XmlTextWriter xml = new XmlTextWriter(Response.OutputStream, System.Text.Encoding.UTF8)
            {
                Formatting = Formatting.None
            };
            xml.WriteStartDocument();
            xml.WriteStartElement("strings");

            xml.WriteStartElement("string");
            xml.WriteAttributeString("id", "lbl_login");
            xml.WriteString(GetTranslation("label_login", strLang));
            xml.WriteEndElement();

            // ... the other labels


            xml.WriteEndElement(); //</strings>
            xml.Close();

        }

Другие соображения:

  • установите для свойства AutoPostback раскрывающегося списка значение false.
person jortizromo    schedule 07.03.2014