我在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会有任何不同。
答案 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。它是一个单独的集合,虽然在控件内部时使用相同的名称引用它。