关于使用隐藏字段保持数据的困惑

时间:2012-01-27 03:03:22

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

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

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

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

如果这是正确的,使用Session对象会更有意义吗?我认为每次都必须用所有模型类型更新每个视图是低效的(而且非DRY)。似乎人们对此持有相互矛盾的意见,而且我没有足够的教育来保持数据(而不使用某些数据源)来确定我的决定。

3 个答案:

答案 0 :(得分:3)

如果你最终得到每个字段/问题的隐藏字段,请意识到这也将添加到您从(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....

希望这有帮助。

答案 1 :(得分:0)

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

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

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

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

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

答案 2 :(得分:0)

按照布伦特安德森的评论,你在调查问卷的最后只保存一次吗?如果是这样,你可以用合理的理由支持这个决定吗?我第二个Adam Tuliper的建议是保存每个步骤的进度,而不是依赖于存储表单

考虑隐藏字段和会话的波动性:它也相对容易丢失,导致UX失败。用户重定向远离HTTP-POST链接,或意外关闭浏览器选项卡,并且纸牌屋崩溃。没有办法让Humpty Dumpty重新组合起来。

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