![]() |
1
4
对于不完整的表单,不能避免单独存放。您需要将它们持久化到某个地方,而不能将它们与完整的表放在一起,因为显然您在基础数据库表上有一些数据库约束,并且希望保留它们。我建议像@ramesh将表单数据封装在类中那样。
将FormData对象绑定到UI控件。当用户希望保存不完整的数据时,请将FormData对象序列化为XML,因为您确实希望在此处使用序列化。
然后可以将serializedFormDataObject保存到单独的表中。当用户加载表单时,可以检查表以查看表单是否不完整。如果是,则可以反序列化窗体加载事件上的数据,例如:
然后可以将FormData绑定到控件。表单完成后,可以删除未完成的表单条目,并将已完成的表单保存到已完成表单的表中。 |
![]() |
2
8
迈克, 您不必序列化整个ASP.NET窗体来捕获填充了一半的数据。最好是在卸载(或Whaterver触发器)时捕获字段中输入的数据并将其保存到数据库中。您只需在再次加载页面时将数据重新分配给控件。这比序列化整个页面要好… 编辑: 我理解根据你在这篇文章中的几条评论,你的要求是
但是你认为在这种情况下重新开始序列化,它会解决所有的问题吗?不。。 考虑以下事实
考虑一下PPL在这里给出的所有事实,这些事实都是有经验的,并做一些分析,然后选择最佳的方法。所有最好的 编辑 我刚遇到 JQuery AutoSave 插件…它和我上面建议的一样,但是以一种非常简单的方式……(以指定的时间间隔运行并保存未保存的内容)。你可以很容易地调整这个来满足你的需求)看看…… |
![]() |
3
1
您表示希望在表单的部分完成状态下对其进行序列化。从您的问题和各种注释来看,您似乎试图使用序列化来避免使用单独的存储。然而,这不是序列化的目的。 序列化将一些对象(通常在内存中)转换为已知格式(例如XML文件),以便可以通过网络传输或持久化到数据库中。序列化并不意味着什么 做 如果对象的序列化形式为, 在里面 序列化窗体。 很抱歉,如果这是曲奇刀,但我认为已经很清楚了: http://en.wikipedia.org/wiki/Serialization 编辑:也许你已经明白我上面说的了——例如,你想把序列化的表单放到会话中吗? 编辑2:好吧,我想我明白了。您可以将序列化表单保存到数据库中,但不希望将单个表单输入保存到数据库中—与保存已完成表单的方式相同。因此,您正在寻找一种方法来保持不完整的表单 不同地 从完成的。 为此,我将在您的数据库中为此确切的内容创建一个新表。它可以有一个单独的数据列(存储序列化数据)或与普通(已完成的表单)表相同的列,而不需要您提到的约束。这有道理吗? |
![]() |
4
1
不幸的是,viewstate还不够;您还需要考虑发布数据和查询参数,以便能够准确地保存和恢复页面状态。 Here 是关于所涉及问题的非常全面的报告,其中包括工作代码。 |
![]() |
5
0
考虑发展 google gears 允许用户脱机工作。基本上,这意味着表单数据将在本地保存,直到提交到服务器。虽然谷歌本身对授权微软开发者不感兴趣,但开发者社区中也有这样的人。这里是一个 tutorial 获取一个ASP.NET应用程序以利用Google Gears。 |
![]() |
6
0
序列化不会帮助您,除非您愿意将序列化数据存储在某个地方,可能是数据库表中的XML片段,也可能是文件(yuk)。 对我来说,这似乎是错误的方法,但是如果您真的想使用序列化,那么有很多选择。我能想到的最简单的方法是将request.form集合序列化为XML,可以使用XmlSerializer,也可以通过循环并自己构建一个XML字符串。 我的建议是… 如果您愿意使用javascript,为什么不尝试在客户机上这样做呢? 例如,您可以通过单击“保存”按钮从表单中收集数据,并将其保存到cookie中。 当用户返回时,您可以检查cookie并从cookie重新加载数据。 只有在表单完成后,才能将表单数据发回服务器。这样可以避免数据库约束问题。 试试这个: http://www.bigresource.com/Tutorial/PHP/Saving_Form_Data_Into_A_Cookie.htm 更新以下评论: 好吧,如果你想接近 将你的表格序列化 您需要将数据存储在某个地方。 基于我认为你想做的: 如果您的表单数据适合一个单独的表,我建议您使用一个不带db约束的“副本表”,并将其称为类似于FormDataHolding(您的原始表是FomrData)的表。您可以从这个表中读和写,并且只在表单数据完成时迁移数据,我使用migrate这个词意味着数据离开保留表并以某种方式进入完整的表。 如果您的表单包含适合于多个表的数据,那么序列化可能是正确的答案,但要准备将此数据存储在某个地方,以一种可能与现有数据模型不匹配的方式,或者准备为存储数据的所有表创建不受约束的“副本表”。 序列化数据并不一定意味着您正在创建XML,但我假设这是您想要的。我将采用从request.form返回nameValueCollection的方法,然后对其进行序列化。如果您使用的是WebForms,则可能需要做不同的操作。 以下是序列化NameValueCollection的人的URL: http://nayyeri.net/blog/Serialize-NameValueCollection/ |
![]() |
7
0
我没有经历过这个大问题,但对我来说,似乎只需要持久化viewstate并使用持久化viewstate,而不是在需要输入一半的表单时创建新的viewstate。 不需要任何额外的逻辑,viewstate的设计就是这样使用的。 任何回发在技术上都是新的页面呈现,但使用的是来自ViewState的值,而Op正试图做同样的事情,不仅仅是回发,而是其他一些时间,但需要同样的事情。 |
![]() |
8
0
我对许多表单(主要是多页表单,但单页表单也是这样)采用的一种方法是让每个表单页面继承一个公共的基类,该类具有许多属性。其中一个属性是FormData,可以定义为:
FormData是一个包含所有属性(窗体字段)的类,例如
每个表单页都有一个“loadData”和“saveData”函数,分别负责用来自FormDataObject对象的数据填充表单,并将数据保存到FormDataObject对象。 基类还包含两个方法savedraft和loaddraft。savedraft将formdataobject序列化为xml并保存到db表(可以简单为2列、id和xmldata):
loadDraft只需加载XML并将其反序列化回一个对象,表单将自动提取并填充字段。LoadDraft的工作方式取决于ISTE的性质和数据的敏感性,例如,如果表单是由登录用户完成的,或者它可能是匿名的,并且是存储在数据库和cookie中的唯一ID。 我构建了许多提交给1个或多个Web服务的站点,当从WSDL文件构建存根并将其用作FormData类时,这种方法非常有效。 |
![]() |
9
0
我过去使用的一种方法是从表单对象捕获post值,并使用可使用soapformatter序列化的momemto类存储这些值。当需要还原时,我所要做的就是使用querystring参数获取一个httphandler类,该类解析预期的ID并反序列化要还原的状态,该状态呈现隐藏字段,以模拟用户从原始页面执行发布。这是两个班。 请注意,您正在捕获表单的状态,因此当您恢复表单时,您将恢复到请求恢复的状态,如果发现问题,您可能需要处理此问题。
|