如何保存一个半完成的表格(How to save a half-completed form)

2019-09-21 22:34发布

我工作的一个项目,我们想给用户保存自己的一半完成的形式,使他们能够回来后并完成它的能力。 我首先要弄清楚我到底如何要做到这一点挣扎。 我将它们保存在同一个池中包含已完成的应用程序,只能用特殊的地位? 我真的不希望具有使字段可为空时,我不希望他们牺牲完成的应用程序的完整性。

我应该在不同的模式中创建相同的数据库结构来保存不完整的申请? 我能有这等模式是对数据库的约束上,并为空的领域更加宽松的占不完整的申请。

是否有更简单的方法来做到这一点? 有没有一种方法,我可以只保存视图状态和恢复在以后的时间?

感谢您的任何意见!

Answer 1:

有可能是一对夫妇的已完成的应用程序,并且这些“半”状态之间的差异:

  1. 正如你所说,大部分的验证是不恰当的,字段将是空的,交叉验证probbably无法执行。
  2. 你可能不需要在数据任意搜索功能。

所以,我会使用一个不同的数据库,包括一些关键领域的记录,如用户的ID,日期,种类,他们正在填补等形式,他们填补了领域的斑点 。 我是一个Java的家伙,所以我不知道.NET的方式来获得BLOB,但在Java中,我可以支持连载的形式数据对象。

这似乎是在C#中的技术有一定的相似性与Java,至少是我理解这条正确。

我会认为手工编写一些简单的“saveAsAString”和“readFromString”代码会有点枯燥,但如果没有标准的.NET技术存在相当的可操作性。



Answer 2:

我挣扎着同样的问题。 一个区别是我的方法是AJAX自动保存类似于您在Gmail和Blogger看到。 但是,这不应该改变的实现,真的。

麻烦的是,我不想保存到平常的表,因为这会已经要求验证(验证整数,货币,日期等)。 我不想唠叨用户时,他们真的只是想离开。

我终于想出了一个叫AjaxSavedData表。 这是在数据库中永久表,但它包含的数据往往是暂时的。 换句话说,它会存储用户的数据暂时直到他们实际完成的页面,并移动到下一个。

该表由只有几列:

AjaxSavedDataID -诠释:

首要的关键。

用户名 -诠释:

识别用户(很容易的)。

页面名称 - VARCHAR(100):

必要的,如果你有多个页面的工作。

控件ID - VARCHAR(100):

我称这是一个控件ID,但它实际上是一个.NET公开所有器WebControls的ClientID属性。 因此,如果例如txtEmail在里面的用户控件命名联系人,则客户端ID将Contact_txtEmail。

价值 - VARCHAR(MAX):

值用户输入对于给定的字段或控制。

DateChanged -日期时间:

的日期被添加或修改的值。

随着一些自定义的控制,该系统很容易让这一切“只是工作。” 在我们的网站,每一个文本框,下拉列表,单选按钮列表的客户端ID等是保证某个网页独特的和一贯的。 所以,我能写出这一切,使所保存的数据的检索自动工作。 换句话说,我没有我每次添加一些字段的表单时间线了这个功能。

该自动保存功能将被正在进入以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);

并应用这一个文本框,下拉列表,列表框或复选框你只需要添加此属性:

onchange="AddToQueue(this)"

......这还是一个单选按钮列表或CheckBoxList的:

onchange="AddToQueue(this, '" + this.ClientID + "')"


Answer 3:

显然,你不能把它保存到实际的数据表,所以我想创建一个单独的表与用户ID,formid和二进制数据类型。 合并形式为一些序列化的结构和序列化到数据库。 当用户回来,你可以反序列化和还原窗体状态。



Answer 4:

我肯定把它保存到数据库中。 你的计划,以挽救一个特殊的地位(命名为完成将工作一个布尔标志)。 然后,你可以创建一个视图只拉项目,其中完成=真,叫CompletedApplications。



Answer 5:

有没有想过使用Silverlight的? Silverlight有独立存储,我所看到的几个例子在那里,开发人员使用独立存储来存储昂贵的客户端数据。

http://pietschsoft.com/post/2008/10/Silverlight-Client-Side-Database-via-LINQ-and-Isolated-Storage.aspx

然后用JS来获得在出数据:

http://msdn.microsoft.com/en-us/library/cc221414%28VS.95%29.aspx

这样可以使你需要任何额外的DB空间,因为所有用户的临时表格条目存储在独立存储,当他们回到如果他们想继续他们的编辑你问用户的网页...然后填充数据的形式在独立存储...

听起来更优美,添加一个新的数据库?

有一个不好的一面是一个机器相关的解决方案。

取决于局部的形式保存的具体目标是什么? 是不是这样,它可以在其他机器上被提出来? 如果是这样,这不是正确的解决方案和数据库保存是一个更好的罪恶。



文章来源: How to save a half-completed form