我需要从数据库中检索记录,将其显示在网页上(我正在使用ASP.NET),但是将记录中的ID(主键)存储在某处,以便稍后我可以返回数据库那个ID(也许是为了做更新)。
我知道可能有几种方法可以做到这一点,例如将ID存储在ViewState或隐藏字段中,但最好的方法是什么?我可以选择这种方法的原因是什么?
答案 0 :(得分:6)
取决于。
您是否关心是否有人看到了记录ID?如果你这样做,那么隐藏的字段和viewstate都不合适;您需要将其存储在会话状态,或加密视图状态。
如果有人提交伪造身份证明的表格,您是否在乎?如果你这样做,你就不能使用隐藏的字段(你需要将CSRF保护作为奖励)
你想要它是不可改变的,但不关心它是否可以观看(有些工作)?使用viewstate并在页面上(或全局)设置enableViewStateMac =“true”
想要隐藏和保护但不能使用会话状态吗?通过设置以下web.config条目来加密您的视图状态
<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />
答案 1 :(得分:2)
您希望最终用户知道该ID吗?例如,如果id值是数据库中的标准1,1种子,我可以查看数字并查看您拥有的客户数量。如果你加密了这个值(就像viewstate那样),我会发现对密钥进行decypher会更加困难(但并非不可能)。
另一种方法是将它存储在会话中,这将在您的应用程序中设置一个(非常小,如果它只是一个整数)性能命中,但意味着我作为用户永远不会看到该主键。它还将对象暴露给应用程序的其他部分,您可能希望或不希望它被暴露(会话对象保持到清除,设置时间(如5分钟)通过或浏览器窗口关闭 - 以较快者为准
查看状态值会在每次回发后导致客户端上出现额外负载,因为视图状态不仅会保存页面的对象,还会在使用后退按钮时记住对象。这意味着在每个帖子之后它的viewstate变得更大,更难使用。它们只存在于页面上,直到浏览器转到另一页面。
每当我像这样在页面中存储ID时,我总是创建一个属性
public int CustomerID {
get { return ViewState("CustomerID"); }
set { ViewState("CustomerID") = value; }
}
或
Public Property CustomerID() As Integer
Get
Return ViewState("CustomerID")
End Get
Set(ByVal value As Integer)
ViewState("CustomerID") = value
End Set
End Property
这样,如果你决定将它从Viewstate更改为会话变量或隐藏的表单字段,只是在属性引用中更改它的情况,页面的其余部分可以使用“Page.CustomerID”访问变量
答案 2 :(得分:0)
ViewState是一个选项。它仅对您所在的页面有效。它不会将请求传递给其他资源,例如Session对象。
隐藏字段也可以正常工作,但是您正在泄漏一些关于您的应用程序的信息给任何足够聪明的人来查看您的页面来源。
您还可以将整个记录存储在ViewState中,并避免再次往返服务器。
答案 3 :(得分:0)
我个人对于在会话中放置任何内容非常谨慎。我们的工作进程已经循环多次,我们失去了会话状态。
当你描述你的问题时,我会把它放在隐藏的字段或页面的视图状态中。
此外,在确定这样放置数据的位置时,请始终查看数据的范围。它是作为单个页面还是整个会话的范围?如果答案是“会话”,我们将其放入cookie中。 (免责声明:我们编写内部网应用程序,我们知道已启用cookie。)
答案 4 :(得分:0)
如果一个简单的id会选择以querystring传递它,那么你就不需要回发了,而且用户和搜索引擎更容易访问页面。
答案 5 :(得分:-1)
Session["MyId"]=myval;
它会更安全,并且基本上提供与将其放入视图状态
相同的机制答案 6 :(得分:-1)
我倾向于在隐藏的领域中坚持这样做,只做一点
<asp:label runat=server id=lblThingID visible=false />