gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:00:01 24 4
gpt4 key购买 nike

我对如何使用隐藏字段在我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com