代码之家  ›  专栏  ›  技术社区  ›  finpingvin

我应该在ViewState中存储数据库ID字段吗?

  •  3
  • finpingvin  · 技术社区  · 18 年前

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

    7 回复  |  直到 18 年前
        1
  •  6
  •   blowdart    18 年前

    视情况而定。

    你介意有人看到记录id吗?如果这样做,则隐藏字段和viewstate都不适用;您需要将其存储在会话状态,或者加密viewstate。

    你是否希望它不可更改,但不关心它是否可以公开查看(通过一些工作)?在页面上(或全局)使用viewstate并设置enableViewStateMac=“true”

    想要隐藏和保护它,但不能使用会话状态?通过设置以下web.config条目来加密viewstate

    <pages enableViewState="true" enableViewStateMac="true" />
    <machineKey ... validation="3DES" />
    
        2
  •  2
  •   digiguru    18 年前

    每次回发后,视图状态值都会在客户端上造成额外的负载,因为如果使用“上一步”按钮,视图状态不仅会保存页面的对象,还会记住对象。这意味着每次回发后,它的viewstate都会变得稍微大一点,更难使用。在浏览器转到另一页之前,它们将仅存在于该页上。

    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”访问该变量。

        3
  •  0
  •   JasonS    18 年前

    隐藏字段也可以工作,但您正在向任何有足够智慧的人泄漏有关您的应用程序的一点点信息,以查看您页面的源代码。

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

        4
  •  0
  •   Mike Becatti    18 年前

    正如您描述的问题一样,我会将其放在隐藏字段或页面的viewstate中。

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

        5
  •  0
  •   Claus Thomsen    18 年前

    若它是一个简单的id,您可以选择在querystring中传递它,那个么您就不需要进行回发,用户和搜索引擎就可以更容易地访问该页面。

        6
  •  -1
  •   Chris James    18 年前
    Session["MyId"]=myval;
    

    它会更安全一些,基本上提供了与将其置于viewstate中相同的机制

        7
  •  -1
  •   Loofer    18 年前

    我倾向于把这样的东西放在隐藏的区域,只要做一点就行了

     <asp:label runat=server id=lblThingID visible=false />