ASP: значение TextBox исчезает при обратной передаче только при пароле - PullRequest
10 голосов
/ 31 января 2010

У меня есть текстовое поле 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>

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

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

Ответы [ 4 ]

15 голосов
/ 31 января 2010

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

this.PINPad.Attributes.Add("value", this.PINPad.Text);
4 голосов
/ 21 июля 2014
protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
  {
        if (!(String.IsNullOrEmpty(txtPwd.Text.Trim())))
        {
             txtPwd.Attributes["value"]= txtPwd.Text;              
        }
        if (!(String.IsNullOrEmpty(txtConfirmPwd.Text.Trim())))
        {
            txtConfirmPwd.Attributes["value"] = txtConfirmPwd.Text;
        }
  }
}
0 голосов
/ 07 марта 2014

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

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

enter image description here

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

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

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

Добавьте функцию javascript, которая будет вызываться из элемента управления dropdownlist, в этом случае эта функция назначается свойству 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 элемента управления dropdownlist.

функция 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.
0 голосов
/ 23 декабря 2013

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

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);
        }
    }
}
...