Я боролся с той же проблемой. Одно из отличий заключается в том, что мой метод включает автоматическое сохранение Ajax, аналогичное тому, что вы видите в Gmail и Blogger. Но это не должно изменить реализацию, на самом деле.
Беда в том, что я не хотел сохранять в обычные таблицы, потому что это потребовало бы проверки (проверка целых чисел, валют, дат и т. Д.). И я не хотел раздражать пользователей об этом, когда они действительно просто пытаются уйти.
Я наконец-то придумал таблицу AjaxSavedData. Это постоянная таблица в базе данных, но содержащиеся в ней данные имеют тенденцию быть временными. Другими словами, он будет временно хранить данные пользователя, пока они фактически не завершат страницу и не перейдут на следующую.
Таблица состоит из нескольких столбцов:
AjaxSavedDataID - int:
Первичный ключ.
ИД пользователя - int:
Определить пользователя (достаточно просто).
PageName - varchar (100):
Необходимо, если вы работаете с несколькими страницами.
ControlID - varchar (100):
Я называю это ControlID, но на самом деле это просто свойство ClientID, которое .NET предоставляет для всех элементов WebControls. Так, если, например, txtEmail находится внутри пользовательского элемента управления с именем Contact, тогда ClientID будет Contact_txtEmail.
Значение - varchar (MAX):
Значение, введенное пользователем для данного поля или элемента управления.
DateChanged - datetime:
Дата добавления или изменения значения.
Наряду с некоторыми пользовательскими элементами управления, эта система позволяет легко "просто работать". На нашем сайте ClientID каждого текстового поля, выпадающего списка, списка радиобутонирования и т. Д. Гарантированно будет уникальным и непротиворечивым для данной страницы. Таким образом, я смог написать все это так, чтобы поиск сохраненных данных работал автоматически. Другими словами, мне не нужно подключать эту функцию каждый раз, когда я добавляю некоторые поля в форму.
Эта функция автоматического сохранения перейдет в очень динамичное приложение для онлайн-страхования бизнеса на techinsurance.com, чтобы сделать его немного более удобным для пользователя.
Если вам интересно, вот Javascript, который позволяет автоматически сохранять:
function getNewHTTPObject() {
var xmlhttp;
/** Special IE only code */
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end
@*/
/** Every other browser on the planet */
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
}
catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
function AjaxSend(url, myfunction) {
var xmlHttp = getNewHTTPObject();
url = url + "&_did=" + Date();
xmlHttp.open("GET", url, true);
var requestTimer = setTimeout(function() { xmlHttp.abort(); }, 2000);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState != 4)
return;
var result = xmlHttp.responseText;
myfunction(result);
};
xmlHttp.send(null);
}
// Autosave functions
var SaveQueue = []; // contains id's to the DOM object where the value can be found
var SaveQueueID = []; // contains id's for binding references (not always the same)
function ArrayContains(arr, value) {
for (i = 0; i < arr.length; i++) {
if (arr[i] == value)
return true;
}
return false;
}
function GetShortTime() {
var a_p = "";
var d = new Date();
var curr_hour = d.getHours();
if (curr_hour < 12)
a_p = "AM";
else
a_p = "PM";
if (curr_hour == 0)
curr_hour = 12;
else if (curr_hour > 12)
curr_hour = curr_hour - 12;
var curr_min = d.getMinutes();
curr_min = curr_min + "";
if (curr_min.length == 1)
curr_min = "0" + curr_min;
return curr_hour + ":" + curr_min + " " + a_p;
}
function Saved(result) {
if (result == "OK") {
document.getElementById("divAutoSaved").innerHTML = "Application auto-saved at " + GetShortTime();
document.getElementById("divAutoSaved").style.display = "";
}
else {
document.getElementById("divAutoSaved").innerHTML = result;
document.getElementById("divAutoSaved").style.display = "";
}
}
function getQueryString(name, defaultValue) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == name) {
return pair[1];
}
}
return defaultValue;
}
function urlencode(str) {
return escape(str).replace(/\+/g, '%2B').replace(/%20/g, '+').replace(/\*/g, '%2A').replace(/\//g, '%2F').replace(/@/g, '%40');
}
function AutoSave() {
if (SaveQueue.length > 0) {
var url = "/AjaxAutoSave.aspx?step=" + getQueryString("step", "ContactInformation");
for (i = 0; i < SaveQueue.length; i++) {
switch (document.getElementById(SaveQueue[i]).type) {
case "radio":
if (document.getElementById(SaveQueue[i]).checked)
url += "&" + SaveQueueID[i] + "=" + urlencode(document.getElementById(SaveQueue[i]).value);
break;
case "checkbox":
if (document.getElementById(SaveQueue[i]).checked)
url += "&" + SaveQueueID[i] + "=" + urlencode(document.getElementById(SaveQueue[i]).value);
default:
url += "&" + SaveQueueID[i] + "=" + urlencode(document.getElementById(SaveQueue[i]).value);
}
}
SaveQueue = [];
SaveQueueID = [];
AjaxSend(url, Saved);
}
}
function AddToQueue(elem, id) {
if (id == null || id.length == 0)
id = elem.id;
if (!ArrayContains(SaveQueueID, id)) {
SaveQueue[SaveQueue.length] = elem.id;
SaveQueueID[SaveQueueID.length] = id;
}
}
Добавьте это на свою страницу, чтобы сделать эту работу:
window.setInterval("AutoSave()", 5000);
И чтобы применить это к Textbox, DropdownList, Listbox или Checkbox, вам просто нужно добавить этот атрибут:
onchange="AddToQueue(this)"
... или это для RadioButtonList или CheckBoxList:
onchange="AddToQueue(this, '" + this.ClientID + "')"