我有一个像这样的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>
然后,无论何时页面回发,屏幕上都会清除文本框,文本框为空(尽管在计时器事件期间,该值会使其返回到服务器。)
有关如何解决此问题的任何建议,以便在回发期间保留其值吗?
答案 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调用,让我们描述一个登录页面的典型场景:
假设我们有一个登录页面,当用户选择带有下拉列表的语言时,用户可以更改其标签的语言
解决方案是调用下拉列表中的 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();
}
其他一些注意事项: