我有一个控件,它为ViewState赋值。它可以工作,但ViewState被禁用。怎么样?

时间:2011-11-02 19:02:02

标签: c# asp.net ajax viewstate

我在ASPX页面上禁用了ViewState:

<%@ Page Title="Home Page" MasterPageFile="~/Views/Shared/WebForm.master" Language="C#" EnableViewState="False" AutoEventWireup="True" CodeBehind="Dashboard.aspx.cs" Inherits="CableSolve.Web.Dashboard.Dashboard"%>

我有以下课程:

public class DashboardUpdatePanel : UpdatePanel
{
    public DashboardUpdatePanel()
    {
        UpdateMode = UpdatePanelUpdateMode.Conditional;
        CssClass = "maxHeight";
    }

    [Category("Appearance")]
    [Description("The CSS class applied to the UpdatePanel rendering")]
    public string CssClass
    {
        get
        {
            string s = (string)ViewState["CssClass"];
            return s ?? String.Empty;
        }
        set
        {
            ViewState["CssClass"] = value;
        }
    }

    protected override void RenderChildren(HtmlTextWriter writer)
    {
        if (IsInPartialRendering == false)
        {
            string cssClass = CssClass;
            if (cssClass.Length > 0)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass);
            }
        }
        base.RenderChildren(writer);
    }
}

如果我删除了对CssClass属性的赋值,我会在页面上看到效果。然而,setter将值赋给ViewState。

这是如何工作的?当然,如果ViewState被禁用,我看不出是否分配了CssClass会有任何不同。

3 个答案:

答案 0 :(得分:3)

禁用ViewState意味着ViewState不会在回发后保留。

在回发中,ViewState仍然有效。

答案 1 :(得分:2)

即使ViewState被禁用,您也可以在页面的生命周期内自由使用ViewState包(禁用ViewState不会使Page.ViewState属性无法运行)。

基本上你在属性设置器中所做的是将CssClass值存储在松散类型的状态包中,而不是成员变量,具有相同的效果。

我的猜测是你在标记中设置CSS属性,这意味着每次渲染页面时都会设置该值,因此无论如何ViewState都不会发挥作用。

<my:control ID="myControl" CssClass="myCssClass" ... />

答案 2 :(得分:0)

控件使用ControlState - 而不是ViewState。它是一个单独的集合,虽然在控件内部时使用相同的名称引用它。