我有ASP.NET 3.5格式的表单。哪里有很多数据元素,哪里我有保存和提交按钮。我需要每2分钟自动保存一次表单。在ASP.NET中实现这种功能的最佳方式是什么?
发布于 2009-09-23 20:47:38
使用Timer类和Tick方法。
发布于 2009-09-23 21:17:52
我为同样的问题挣扎了一段时间。问题是我不想保存到通常的数据库表中,因为这需要验证(验证整数、货币、日期等)。我不想在用户想要离开的时候纠缠他们。
我最终想出了一个名为AjaxSavedData的表,并通过调用Ajax来填充它。AjaxSavedData是数据库中的一个永久表,但它包含的数据往往是临时的。换句话说,它将临时存储用户的数据,直到他们实际完成页面并移动到下一个页面。
该表仅由几列组成:
AjaxSavedDataID - int:
主键。
UserID - int:
识别用户(足够简单)。
PageName - varchar(100):
如果您正在处理多个页面,则是必需的。
ControlID - varchar(100):
我称之为ControlID,但它实际上只是.NET为所有WebControls公开的ClientID属性。因此,例如,如果txtEmail位于名为Contact的用户控件中,则ClientID将为Contact_txtEmail。
varchar值-varchar(最大):
用户为给定域或控件输入的值。
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执行以下...or操作:
onchange="AddToQueue(this, '" + this.ClientID + "')"我敢肯定,如果你使用JQuery,这个Javascript可以简化很多,所以你可能会考虑这一点。但在任何情况下,AJAX都是可以使用的。这是谷歌用来在gmail中自动保存你的电子邮件信息的工具,当你在写一篇新文章时,在blogger中也是如此。因此,我将这个概念应用到一个包含数百个表单元素的大型ASP.NET应用程序中,效果非常好。
https://stackoverflow.com/questions/1468427
复制相似问题