Asp.net mvc 3 关于使用隐藏字段保存数据的混淆

Asp.net mvc 3 关于使用隐藏字段保存数据的混淆,asp.net-mvc-3,session,persistence,hidden-field,Asp.net Mvc 3,Session,Persistence,Hidden Field,对于如何在MVC应用程序中使用隐藏字段来持久化数据,我有点困惑。(如果有意义的话,我也愿意使用Session。) 基本上,我有一个询问一系列问题的应用程序(根据用户给出的答案,这些问题可以以不同的顺序出现)。这些问题是作为单个控制器的局部视图提供的(该控制器调用一个助手方法,该方法了解问题的提问顺序)。当用户回答问题时,我使用Ajax提交当前答案,并用当前答案更新侧栏。(他们可以随时返回以更改问题的答案。)我的问题的所有答案都存储在单个“答案”模型对象中(每个答案都有一个属性) 根据我对隐藏字段

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

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

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


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

如果每个字段/问题都有一个隐藏字段,请意识到这也会增加从(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....
string json=Request.Form[“hiddenFieldOfQuestionAnswerData”];
QuestionAnswerModel qaData=JsonConvert.DeserializeObject(json);
//去做点什么。。。。

希望这有帮助。

既然您已经在处理隐藏元素,只需序列化您的表单并使用ajax提交即可。对于每个加载的表单,使用ajax加载的局部视图。 就我个人而言,我会让answer对象真正成为一个问题/答案的集合。将所有问题作为属性是完全不可自定义的,任何时候添加问题都需要更改代码

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

重新序列化表单,如果选择该路径:

$.post(“@Url.Action(“Edit”),$(“#yourform”).serialize());
按照Brent Anderson的评论,您是否只在问卷结束时保存一次?如果是,您能否有充分的理由支持该决定?我支持Adam Tuliper的建议,即保存每一步的进度,而不是依赖表单进行存储

考虑隐藏字段和会话的易变性:这两者都相对容易丢失,从而导致用户体验失败。用户从HTTP-POST链接中重定向,或者意外关闭浏览器选项卡,导致卡片屋倒塌。无法将Humpty Dumpty重新组合在一起


我的选择是为每次提交使用持久数据存储。这样,如果隐藏字段或会话丢失,您可以恢复问卷。如果用户已登录,您可以将数据与Principal.Name关联。如果未登录,您可以打开匿名配置文件(也使用cookie)不管是哪种方式,如果你从web服务器带外保存数据,你甚至可以在用户重新启动机器后恢复问卷。

Hmmm…我没有考虑JSON序列化版本。我有点喜欢。数据非常基本(它实际上只是一个“测验”类网站,我跟踪用户的答案).所以,我不认为它会变得很重。你有更多的细节吗?用一些伪JavaScript/C更新了我的答案。如果你还有其他问题,请告诉我。你是否只在调查完成后保存答案?如果没有,你只需要在页面上为问题设置隐藏字段如果您只保存一次,您可以使用session或David的序列化json建议(我建议这样做)。 $.post("@Url.Action("Edit")", $("#yourform").serialize());