C# 在get/post处理中避免重复的数据库访问

C# 在get/post处理中避免重复的数据库访问,c#,asp.net-mvc,C#,Asp.net Mvc,我正在使用asp.net MVC 3: 我有一个视图,它的输入字段在GET请求期间动态生成(从数据库中检索)。在POST过程中,如果验证失败,我必须重新显示字段,从而再次检索它们。有没有办法避免冗余的数据库访问,例如,有没有办法在GET和POST请求之间共享一些数据?有办法处理这个问题,比如将数据存储在TempData或Session中等等。。。但我认为你不应该那样做。您应该始终重新查询数据访问层并获取它。这并不意味着您总是查询db表。数据访问层可以从缓存中提供数据,或者对表进行查询 在幕后,T

我正在使用asp.net MVC 3:


我有一个视图,它的输入字段在GET请求期间动态生成(从数据库中检索)。在POST过程中,如果验证失败,我必须重新显示字段,从而再次检索它们。有没有办法避免冗余的数据库访问,例如,有没有办法在GET和POST请求之间共享一些数据?

有办法处理这个问题,比如将数据存储在TempData或Session中等等。。。但我认为你不应该那样做。您应该始终重新查询数据访问层并获取它。这并不意味着您总是查询db表。数据访问层可以从缓存中提供数据,或者对表进行查询

在幕后,TempData使用Session来持久化这些值。TempData的值会一直存在,直到读取或会话超时为止。以这种方式持久化TempData可以启用重定向等场景,因为TempData中的值可以在单个请求之外使用。

不是直接使用,而是使用

如果在发布表单时,将所有数据发送回服务器,然后将这些数据发送到模型,则模型将拥有填充其字段所需的所有数据

当您从ajax检索结果时,可以通过ajax发送json数据 只填充已更改的字段

然而,我不认为重新查询有什么大不了的,除非你谈论的是一个特别痛苦的几秒钟或更长时间的查询


哦,不要将数据存储在会话或缓存中。没有理由用单个POST阻塞ram,如果您错误地重用会话密钥,这可能会在以后引发潜在问题。

我认为您需要的是“延迟加载”

创建一个
static
变量(在执行数据库查询的类中),该变量将在数据库查询结果发生时存储该结果,但最初应为
null
。然后创建一个getter方法,检查这个
静态
变量是否为
null
。如果它是
null
,则运行DB查询并存储结果,否则只返回
静态
var的内容。然后总是用那个吸气剂,你就准备好了


我知道一些特别迂腐的人在使用像这样的
static
变量时会畏缩。。。但它工作得很好,而且没有什么麻烦

也许打开viewstate的纯asp.net更适合这种情况。MVC可以很好地处理这种情况。转到viewstate的损坏asp.net模型将返回到使用木炉加热房屋,因为火也可以烹饪食物。当我发送数据时,我的模型仅填充输入字段的值(但我需要其他内容,例如每个字段的标签等)。我发现正确填充模型的唯一方法是添加一堆隐藏字段,其中包含我在后期处理中需要的数据,但这看起来相当混乱。我非常担心可伸缩性。如果你坚决反对重新查询,我不确定这是一个坏主意,即使通过可伸缩性,然后,您唯一的选择是通过隐藏字段或ajax将数据发送回服务器。您可以将其全部转换为json,并将json放在一个隐藏字段中,这样当它发回时,您就可以反序列化一个参数?至少它只限于一次往返,而不是像会话那样的长期坚持。@Chris:是的。TempData是另一个选项。但在幕后,TempData正在使用会话来持久化值。@Chris。我更新了我的答案来说明这一点(tempdata是如何工作的)。谢谢你的提醒