2009-09-23 4 views
2

У меня есть форма в ASP.NET 3.5. Где много элементов данных, и где у меня есть Сохранить и Добавить Buttions. Мне нужно автоматически сохранять свою форму каждые 2 мин. Каков наилучший способ реализовать эту функцию в ASP.NET.Автоматическое сохранение формы

+0

http://stackoverflow.com/questions/875834/asp-net-forms-autosave – Nick

ответ

1

Используйте класс Timer и метод Tick.

+0

А, прости, я снова посмотрел на то, с чем вы связались. Это можно было бы сделать на самом деле. Хотя вы столкнулись с потенциальными ошибками валидатора, о которых я упоминаю в своем ответе. И тогда postbacks могут быть немного раздражающими, когда вы не просите их. Но все же, я бы взял backvote, если StackOverflow позволит мне. –

2

Я долгое время боролся с той же проблемой. Проблема заключалась в том, что я не хотел сохранять в обычные таблицы базы данных, потому что это потребовало бы проверки (проверки целых чисел, валют, дат и т. Д.). И я не хотел называть пользователя об этом, когда они могут пытаться уйти.

В итоге я столкнулся с таблицей AjaxSavedData и делал вызовы Ajax для ее заполнения. 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 + "')" 

Я уверен, что Javascript может быть упрощена совсем немного, если вы использовали JQuery, так что вы можете рассмотреть вопрос о том, что. Но в любом случае AJAX - это то, что нужно использовать. Это то, что Google использует для автоматического сохранения вашего сообщения электронной почты в gmail, и то же самое происходит в блогере, когда вы пишете новый пост. Поэтому я принял эту концепцию и применил ее к огромному приложению ASP.NET с сотнями элементов формы, и все это прекрасно работает.

Смежные вопросы