asp.net-mvc-3 - 使用隐藏字段来持久化数据的困惑

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

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

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

根据我对隐藏字段的理解,我必须在每个单独的 View 中为每个问题提供隐藏字段,以便保留该数据。这样对吗?

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

最佳答案

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

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

在不太了解你的情况的情况下,我想我更倾向于 session 的想法。

我的另一个想法是使用单个隐藏字段,但在其中保留模型的 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....

希望这可以帮助。

关于asp.net-mvc-3 - 使用隐藏字段来持久化数据的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9028481/

相关文章:

java - 关于使用 Hibernate 将对象映射到数据库

jquery - 跨域 JSON 调用

session - 简单终端命令后 RHEL session 崩溃(例如 cd ~)

ruby-on-rails - Rails v3 session 销毁不起作用?

c# - 将 session 状态持久化到数据库表

java - 使用 Ebean 生成 "on delete cascade"

asp.net-mvc - 我的应用程序中未加载图像、css 和 js 文件

visual-studio-2010 - 将 HTML5 标记添加到 MVC3 站点

asp.net - 为 ViewModel 创建 View 帖子返回具有空外键属性的 ViewModel

java - Apache MINA 从 IoSession 读取