我需要从数据库中检索记录,将其显示在网页上(我正在使用ASP.NET),但是将记录中的ID(主键)存储在某处,以便稍后我可以返回数据库那个ID(也许是为了做更新)。

我知道可能有几种方法可以做到这一点,例如将ID存储在ViewState或隐藏字段中,但最好的方法是什么?我可以选择这种方法的原因是什么?

有帮助吗?

解决方案

取决于。

您是否关心是否有人看到了记录ID?如果你这样做,那么隐藏的字段和viewstate都不合适;您需要将其存储在会话状态,或加密视图状态。

如果有人提交伪造身份证明的表格,您是否在乎?如果你这样做,你就不能使用隐藏的字段(你需要将CSRF保护作为奖励)

你想要它是不可改变的,但不关心它是否可以观看(有些工作)?使用viewstate并设置enableViewStateMac =" true"在您的页面上(或全球)

想要隐藏和保护但不能使用会话状态吗?通过设置以下web.config条目来加密您的视图状态

<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />

其他提示

您希望最终用户知道该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”访问变量;

ViewState是一个选项。它仅对您所在的页面有效。它不会将请求传递给其他资源,例如Session对象。

隐藏字段也可以正常工作,但是您正在泄露一些关于您的应用程序的信息,以及任何足够聪明的人来查看您的页面来源。

您还可以将整个记录存储在ViewState中,并避免再次往返服务器。

我个人对于在会话中放置任何内容非常谨慎。我们的工作进程已经循环多次,我们失去了会话状态。

当你描述你的问题时,我会把它放在隐藏的字段或页面的视图状态中。

此外,在确定这样放置数据的位置时,请始终查看数据的范围。它是作为单个页面还是整个会话的范围?如果答案是“会话”,我们将其放入cookie中。 (免责声明:我们编写内部网应用程序,我们知道已启用cookie。)

如果一个简单的id会选择以querystring传递它,那么你就不需要回发了,而且用户和搜索引擎更容易访问页面。

Session["MyId"]=myval;

它会更安全,并且基本上提供与将其放入视图状态

相同的机制

我倾向于在隐藏的领域中坚持这样做,只做一点

 <asp:label runat=server id=lblThingID visible=false />
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top