ASP:TextBox值仅在密码时才会在回发中消失

时间:2010-01-30 21:42:57

标签: asp.net textbox postback passwords

我有一个像这样的asp.net文本框:

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

正如您可能已经猜到的那样,屏幕上的密码键盘上的文本框。 Javascript填写值。页面每五秒发回一次(如果重要的话,使用更新面板)以更新屏幕上的各种其他不相关项目。这很好用。

但是,当我将其转换为密码文本框时,如下所示:

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

然后,无论何时页面回发,屏幕上都会清除文本框,文本框为空(尽管在计时器事件期间,该值会使其返回到服务器。)

有关如何解决此问题的任何建议,以便在回发期间保留其值吗?

4 个答案:

答案 0 :(得分:15)

作为一项安全功能,ASP.NET会尝试禁止您将密码值发送回客户端。如果您对安全问题没有问题(即,它不是真正安全的信息,或者您确定连接是安全的),您可以手动设置控件的"value"属性,而不是使用其Text属性。 1}}属性。它可能看起来像这样:

this.PINPad.Attributes.Add("value", this.PINPad.Text);

答案 1 :(得分:4)

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

答案 2 :(得分:0)

这是另一种方法: -

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

答案 3 :(得分:0)

在回发中丢失密码的问题可以避免使用异步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事件中,不会像以前那样执行回发。

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包含在页面GetLoginTranslations.aspx中构建的XML,并且在那里定义了此XML的结构。

GetLoginTranslations.aspx中的Page_Load()事件应如下所示:

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。