什么是ViewState?它是如何编码的?它加密了吗?谁使用ViewState?

时间:2010-02-21 08:18:56

标签: asp.net html xhtml encoding viewstate

什么是ViewState?它是如何编码的?它加密了吗?谁使用ViewState?

6 个答案:

答案 0 :(得分:12)

视图状态是一种哈希映射(或者至少你可以这么认为)ASP.NET用来存储页面的所有临时信息 - 比如当前在每个选择框中选择的选项,每个文本框中都有值,哪个面板是打开的等等。您还可以使用它来存储任意信息。

整个地图被序列化并且加密编码并保存在隐藏变量中,只要您在需要服务器往返的页面上执行任何操作,该变量就会发布回服务器。这是您可以从服务器代码访问控件上的值的方法。如果更改服务器代码中的任何值,则会在视图状态中进行更改并将其发送回浏览器。

请注意您在视图状态中存储了多少信息,但是......它很快就会变得臃肿,并且每次都很慢地转移到服务器并返回。

至于加密,我不知道它有多强,但它肯定不易人类阅读。不过,我不会将它用于敏感信息。 正如评论中指出的那样,它根本没有加密。只是基础编码,很容易逆转。

答案 1 :(得分:10)

如果你真的想要理解 ViewState(不仅仅是它的用途),那么你可能想要阅读this fabulous article(不幸的是,我不是作者: - )。 但要注意,它有点陈旧,但仍然是一个非常好的阅读。

答案 2 :(得分:4)

它是由ASP.NET生成的隐藏字段,包含有关页面上所有控件的信息。理想情况下,视图状态不需要加密,因为它永远不应包含敏感信息。要指示应加密视图状态,请将<machineKey>文件中的machine.config元素的验证属性设置为3DES。 MSDN上有nice article描述ViewState。

答案 3 :(得分:4)

请允许我与您分享我今天所学到的知识。

什么是ViewState?

  

简而言之,Microsoft®ASP.NET视图状态是使用的技术   一个ASP.NET网页,用于持久更改Web窗体的状态   跨回发。

     

View State将页面控件的值存储为字符串   在一些散列和编码技术中进行散列和编码。它只是   包含有关页面及其控件的信息

如果我有这样的话:

protected void Page_Load(object sender, EventArgs e)
{
    ViewState["UserName"] = "Shubh Dasgupta";
    ViewState["Password"] = "IAmAPassword";
}

默认情况下,页面的视图状态位于名为__VIEWSTATE的隐藏表单字段中。

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
     value="/wEPDwULLTE2MTY2ODcyMjkPFgQeCFVzZXJOYW1lBQ5TaHViaCBEYXNndXB0YR4IUGFzc3dvcmQFDElBbUFQYXNzd29yZGRk2/xP37hKKE9jfGYYzFjLuwpi6rHlPdXhfSspF6YRZiI=" />

Read More

它是如何编码的?它是加密的吗?

默认情况下,ViewState是编码的而不是加密的。让我们以前的输入类型值运行下面的代码:

protected void btnDecode_Click(object sender, EventArgs e)
{
    //txtViewState.Text = "/wEPDwULLTE2MTY2ODcyMjkPFgQeCFVzZXJOYW1lBQ5TaHViaCBEYXNndXB0YR4IUGFzc3dvcmQFDElBbUFQYXNzd29yZGRk2/xP37hKKE9jfGYYzFjLuwpi6rHlPdXhfSspF6YRZiI="
    string str = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(txtViewState.Text));
    lblDecodedString.Text = str;
}

上述代码的输出为?-1616687229UserNameShubh DasguptaPasswordIAmAPassworddd??O??J(Oc|f?X?? b???=??}+)?f"

如果您仔细阅读我之前提到的文章的详细信息,您会想出“成本的ViewState”,其中写得清晰而精美:

  

在所有页面访问中,在保存视图状态阶段,Page类   收集其中所有控件的集合视图状态   控制层次结构并将状态序列化为base-64编码   串。 (这是隐藏的__VIEWSTATE中发出的字符串   同样,在回发时,加载视图状态阶段需要   反序列化持久化的视图状态数据,并更新相关的数据   控件层次结构中的控件。

亲自尝试一下。 Download Sample

答案 4 :(得分:2)

ViewState未使用base64编码加密为默认值。如果您的页面具有控件操作,则可能需要使用viewstate。

答案 5 :(得分:1)

ViewState是asp.net用于启用回发模型的一种技术。标记为runat="server"的所有控件的状态都存储在此base64字符串中。

pluralsite article更深入地解释