Il problema di perdere la password nel postback può essere evitare di fare uso di Asynchronous JavaScript chiama, consente descrivere uno scenario tipico di una pagina di login:
consente di dire che abbiamo una pagina di login, che permette all'utente di cambiare la lingua delle sue etichette quando l'utente sceglie una lingua con una DropDownList
una soluzione potrebbe essere quella di richiamare SelectedIndexChanged caso di DropDownList, fare un postback che va al server e raccoglie le etichette nella lingua scelta.
in questo scenario la password del campo andrà persa a causa della funzionalità di sicurezza di ASP.NET che rende i campi delle password non persistenti tra i postback.
Questo scenario può essere risolto se il postback viene evitato utilizzando le chiamate Asynchronous Technology e XML (Ajax).
aggiungere una funzione javascript che verrà richiamato dal controllo DropDownList, in questo caso, questa funzione viene assegnata alla proprietà Comando della dropdownlist in codice dietro:
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);
}
}
}
}
}
La Tradurre funzione prende come parametro selezionato opzione lingua nel controllo a discesa ed esegue la chiamata asincrona come mostrato di seguito.
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);
}
La funzione translate mostrato sopra esegue la chiamata e ottenere i risultati nella pagina aspx specificato (in questo caso "GetLoginTranslations.aspx ")
quando la richiesta è completata e l'request.onreadystatechange viene impostato sui TranslateLabels funzione viene eseguita questa funzione.
in questo modo il postback non viene eseguito come prima in caso OnSelectedIndexChanged del dropdownlist . controllo
la funzione TranslateLabels sarebbe qualcosa di simile:
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;
}
///....
}
}
}
}
}
}
il request.responseXML contiene il codice XML incorporato nella pagina GetLoginTranslations.aspx e la struttura di questo XML è definito lì.
il Page Load() evento nel GetLoginTranslations.aspx dovrebbe essere simile:
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();
}
Alcune altre considerazioni:
- impostare la proprietà AutoPostBack del dropdownlist su false.
C'è articolo su come risolvere questo in modo più sicuro (se non perfettamente) a http://www.codeproject.com/Articles/18927/How-to-safely-keep-a-password- campo durante-postbac – Mark