是否可以自定义ViewState实现?

时间:2013-11-21 15:16:34

标签: c# asp.net .net viewstate

Asp.Net有一些选项来影响其ViewState生成页面的方式(加密,添加mac,ViewStateUserKey)。

我想自己做,不是基于配置,而是基于我自己的使用其他算法进行序列化和加密的类。这可能吗?

2 个答案:

答案 0 :(得分:3)

是的,这是可能的。例如,我基于您可以在CodeProject上找到的一些文章构建了一个视图状态压缩逻辑。您需要覆盖PageStatePersister中的Page并创建一个源自PageStatePersister的类:

// In your page:
protected override PageStatePersister PageStatePersister
{
   get { return new ViewStateCompressor(this); }
}

创建一个新类:

public class ViewStateCompressor : PageStatePersister
{
    private const string ViewStateKey   = "__VSTATE";
    public ViewStateCompressor(Page page) : base(page)
    {
    }

    private LosFormatter stateFormatter;
    protected new LosFormatter StateFormatter
    {
        get { return this.stateFormatter ?? (this.stateFormatter = new LosFormatter()); }
    }

    public override void Save()
    {
        using (StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture))
        {
            // Put viewstate data on writer
            StateFormatter.Serialize(writer, new Pair(base.ViewState, base.ControlState));

            // Handle your viewstate data
            // byte[] bytes = Convert.FromBase64String(writer.ToString());

            // Here I create another hidden field named "__VSTATE"
            ScriptManager.RegisterHiddenField(Page, ViewStateKey, Convert.ToBase64String(output.ToArray()));
        }
    }

    public override void Load()
    {
        byte[] bytes = Convert.FromBase64String(base.Page.Request.Form[ViewStateKey]);
        using (MemoryStream input = new MemoryStream())
        {
            input.Write(bytes, 0, bytes.Length);
            input.Position = 0;

            // Handle your viewstate data

            Pair p = ((Pair)(StateFormatter.Deserialize(Convert.ToBase64String(output.ToArray()))));
            base.ViewState = p.First;
            base.ControlState = p.Second;
        }
    }
}

答案 1 :(得分:1)

是的,您需要实施自己的PageStatePersister课程。 MSDN页面向您显示了它的工作原理示例。

我们将一个相当大的ViewState卸载到文件系统中,并在实际页面上用更紧凑的GUID替换它。