跨回发存储状态
时间:2020-03-06 14:22:40 来源:igfitidea点击:
跨回发存储字符串数据的最佳方法是什么。我需要存储多个实体的ID和名称。我当时正在考虑在viewstate中使用数据表,但这会使viewstate变得太大吗?我还不能使用数据库,因为我将插入一条与其他记录需要关联的记录。因此,我将暂时存储它们,直到用户提交表单为止。
解决方案
我们可以将它们存储到cookie中,这也允许我们从Javascript访问它们。或者,我们可以将一个简单的字符串数组存储到视图状态。在很大程度上取决于我们希望存储什么信息以及存储多少信息。
几种方法(尽管不是详尽的清单):
- ViewState
- 隐藏的领域
- 会议
- 请求参数
- 饼干
ViewState很好。如果要在回发之间存储它,则最好使用客户端解决方案。因此,我们将在ViewState或者隐藏字段中的某个位置添加大小。
如果要在服务器端执行此操作,则可以使用Session,但请记住在可能的时候进行清理。
实际上,我们有很多选择,而这些选择完全取决于我们自己的应用程序的要求。
- ViewState-我们可以将数据添加到页面的viewstate。这样做的好处是,数据将仅在用户停留在页面上并将其发布回服务器的生命周期内才有效。相对于隐藏字段,它的另一个优点是用户很难侵入它并更改值(实际上,我相信我们可以加密视图状态)。当然,缺点在于页面大小-我们添加到视图状态的所有内容都是另外一件事,它会被放到用户页面上,然后被发布回服务器。这使得它对于存储大量数据不是最佳的。
- Cookies-我们可以将信息以Cookies的形式回传给用户。在这种情况下,我们可以声明信息将持续多长时间-针对打开浏览器的用户范围,或者特定的日历时间。每当用户点击该信息时,该信息将可用于我们应用程序的任何页面。坏消息是我们可以存储的信息量有限,并且用户可以很容易地更改自己的cookie。
- 会话-我们正在将用户信息存储在自己服务器的内存中(我将不讨论各种类型的会话存储)。在这种情况下,该信息将在用户会话有效期内一直存在,并且可用于我们应用程序的所有页面。尽管会话劫持是我们可能想探究的风险,但没有用户直接修改这些值的风险。但是,缺点是,在这种情况下,我们将使用宝贵的服务器资源-如果应用程序负载很大,则将来可能会影响可伸缩性。
正如我所说,我们选择做什么将完全取决于应用程序的需求和要求。
遇到这种情况时,我会为要填充到Viewstate中的字段创建一个结构。考虑到整个页面的控件集已经存在,我可以在页面大小和生命周期中添加一个小的结构:)
此外,在处理完页面后,它会自行清理,因此不必担心会用废话填充Session。
我同意接受的答案,但我还要补充一点,如果我们只想跟踪简单的键/值集合,则最好将通用词典放入ViewState或者Session中:
Dictionary<int, string> myValues = new Dictionary<int, string>(); myValues.Add(1, "Apple"); maValues.Add(2, "Pear");