【问题标题】:Confusion on the Use of Hidden Fields for Persisting Data对使用隐藏字段进行持久化数据的困惑
【发布时间】:2012-01-27 03:03:21
【问题描述】:

我对如何在 MVC 应用程序中使用隐藏字段来持久化数据感到有些困惑。 (如果有意义的话,我也愿意使用 Session。)

基本上,我有一个应用程序会提出一系列问题(根据用户给出的答案,这些问题可能会以不同的顺序出现)。这些问题是作为来自单个控制器的部分视图提供的(它调用一个帮助方法,该方法了解应该如何提出问题的顺序)。当用户回答问题时,我使用 Ajax 提交当前答案,并用他们当前的答案更新侧边栏。 (他们可以随时返回以更改问题的答案。)我的问题的所有答案都存储在一个“答案”模型对象中(每个答案都有一个属性)。

根据我对隐藏字段的理解,我必须为每个问题在每个视图中提供隐藏字段,以便保留该数据。这是正确的吗?

如果这是正确的,那么使用 Session 对象是否更有意义?我认为每次都必须使用所有模型类型更新每个视图是低效的(而且非常不干)。似乎人们对此有不同的看法,而且我在持久化数据(以及不使用某些数据源)方面没有受过足够的教育,无法确定我的决定。

【问题讨论】:

  • 您是否只在调查完成后才保存答案?如果没有,您只需要在页面上为当前视图中正在询问的问题设置隐藏字段。如果你只保存一次,你可以使用 session 或 David 的序列化 json 建议(我会建议)。

标签: asp.net-mvc-3 session persistence hidden-field


【解决方案1】:

如果您最终为每个字段/问题添加了一个隐藏字段,请意识到这也会添加到您从(DOM 本身)向下发送并向上发送到(表单变量)服务器的有效负载中。虽然这对于一些隐藏字段可能还不错,但我认为一段时间后它会变得相当难以管理且效率低下。

会话在这里可能是一个很好的解决方案,因为您不必使用隐藏字段复制您的问题。缺点是每次向服务器发送数据以补充会话时,都需要进行网络跳跃(或从内存缓存中读取)。

在不太了解您的情况的情况下,我想我会更倾向于会话的想法。

我的另一个想法是使用单个隐藏字段,但在其中保留模型的 JSON 序列化版本,并在客户端使用 JavaScript 更新它并在服务器端使用 Json.NET 读取它并与它一起工作。同样,这实际上取决于数据的大小以及您正在使用它做什么。

我希望这会有所帮助。祝你好运!

更新

基于评论中的一个问题,以下是如何使用 JSON 来保存和传输数据.... 注意:我更喜欢 jQuery,所以我使用它而不是纯 JavaScript 来演示.

在 JavaScript 中,您将有一个变量来保存您的对象:

var questionJson = {};

当问题得到回答时,您可以将它们添加到 JavaScript 对象字面量中:

$('.question').blur(function(e){
  var questionName = $(this).attr('name');  //assume the field has an attribute name that is the question name identifier
  questionJson[questionName] = $(this).val();  //this will build up your object literal with name/value pairs of questions/answers
});

提交表单时,在实际提交之前将对象字面量分配给表单中的隐藏字段...

$('#submitButton').click(function(e){
  e.preventDefault();
  $('#hiddenFieldOfQuestionAnswerData').val(JSON.stringify(questionJson));
  $('#myQuestionAnswerForm').submit();
});

在服务器端,将隐藏字段从表单变量中拉出并使用 Json.NET(或其他 Json 反序列化器)反序列化 JSON 字符串...

string json = Request.Form["hiddenFieldOfQuestionAnswerData"];
QuestionAnswerModel qaData = JsonConvert.DeserializeObject<QuestionAnswerModel>(json);
//go do stuff....

希望这会有所帮助。

【讨论】:

  • 嗯...我没有考虑过 JSON 序列化版本。我有点喜欢。数据非常基本(它实际上只是一个“测验”类型的网站,我会跟踪用户的答案)。所以,我认为它不会变得非常重量级。你有更多关于这样做的细节吗?
  • 用一些伪 JavaScript/C# 更新了我的答案。如果您还有其他问题,请告诉我。
【解决方案2】:

由于您似乎已经在处理隐藏元素,只需序列化您的表单并通过 ajax 提交即可。为每个加载的表单使用 ajax 加载的部分视图。 就个人而言,我会让答案对象真正成为问题/答案的集合。将所有问题作为属性根本无法自定义,并且任何时候添加问题都需要更改代码。

我会保存每一步的进度,而不是依赖表单进行存储。

如果您选择该路线,则重新序列化表单:

http://api.jquery.com/jQuery.post/

$.post("@Url.Action("Edit")", $("#yourform").serialize());

【讨论】:

    【解决方案3】:

    按照布伦特安德森的评论,您是否只在问卷末尾保存一次?如果是这样,您能否以充分的理由支持该决定?我赞同 Adam Tuliper 的建议,即保存每一步的进度,而不是依赖表单进行存储

    考虑隐藏字段和 Session 的波动性:两者都比较容易丢失,导致 UX 失败。用户重定向远离 HTTP-POST 链接,或者不小心关闭了浏览器选项卡,纸牌屋就崩溃了。没有办法让 Humpty Dumpty 重新组合在一起。

    我的选择是为每次提交使用持久数据存储。这样,如果隐藏字段或会话丢失,您可以恢复调查表。如果用户已登录,您可以将数据与 Principal.Name 相关联。如果没有,您可以打开匿名配置文件(也使用 cookie)并将其存储起来。无论哪种方式,如果您从 Web 服务器带外保存数据,即使在用户重新启动计算机后,您也可以恢复调查问卷。

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2012-02-23
      • 2012-05-22
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2014-05-13
      相关资源
      最近更新 更多