Проблему потери пароля при обратной передаче можно избежать, используя асинхронные вызовы JavaScript, давайте опишем типичный сценарий для страницы входа в систему:
Допустим, у нас есть страница входа в систему, которая позволяет пользователю изменять язык своих ярлыков, когда пользователь выбирает язык с выпадающим списком
![enter image description here](https://i.stack.imgur.com/HFPEC.png)
решение было бы вызвать 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.