【问题标题】:Disable ASP.NET viewstate for some controls but not all禁用某些控件的 ASP.NET 视图状态,但不是全部
【发布时间】:2012-02-20 18:30:30
【问题描述】:

如何在我的 ASP.NET 页面中为大多数控件禁用视图状态,但允许某些控件仍使用 ViewState?

我试过了:

  • 在属性中我更改了EnableViewState=false
  • 在页面顶部使用<%@ Page Language="C#" EnableViewState="false" ... >

但是如何启用某些控件以仍然允许视图状态?

我正在使用 .NET 4。

【问题讨论】:

  • 您的问题是什么?您已经列出了为单个控件和整个页面禁用 ViewState 的方法...

标签: asp.net


【解决方案1】:

我找到了一种方法,但只在.NET框架中使用这个 4.把这个放在页面指令中:

<% ----    ViewStateMode="Disabled" %>

并为每个想要保存视图状态的控件使用它(例如):

<asp:DropDownList ID="comGrade" runat="server" ViewStateMode="Enabled">
</asp:DropDownList>

【讨论】:

    【解决方案2】:

    ASP.NET 4 允许对视图状态进行更多控制。请参阅 MSDN 关于 ViewStateMode 属性的文档。还有关于 SO Minimizing viewstate- confused by EnableViewState and ViewStateMode in asp.net 4.0 的问题。

    在 ASP.NET v4 之前的版本中,禁用 ViewState 也会对所有子级禁用它,无论是否将子级设置为 EnableViewState="true"。在 ASP.NET 4 中,您可以按照 MSDN 文档的建议重新启用孩子:

    禁用页面的视图状态并为特定的页面启用它 控制页面,设置页面的EnableViewState属性, 控件为true,设置页面的ViewStateMode属性为 Disabled,并将控件的ViewStateMode属性设置为 启用

    【讨论】:

    • 当我将页面的 ViewStateMode 属性设置为禁用时。我无法将控件的 ViewStateMode 属性设置为启用。当我将控件的 ViewStateMode 属性设置为启用时,我的控件在页面回发后没有值
    • @Mahdijokar:您是否在页面和控件上设置了EnableViewState=true?如果是这样,并且它仍然没有在回发时填充,您能否提供控制源,以便我们确保您在正确的页面生命周期事件中保存/加载视图状态?
    【解决方案3】:

    听起来像是 ControlState 的工作:

    http://msdn.microsoft.com/en-us/library/1whwt1k7.aspx

    【讨论】:

    • 无法关闭ControlState。因此,您要确保控件的所有使用都始终需要它。如果您无法完全控制控件的使用,最好尽可能将信息保存在 ViewState 中,以便不想使用它的消费者可以将其关闭。
    【解决方案4】:

    可以在应用程序、页面或控件级别禁用 ViewState。

    要在应用程序级别禁用,请将以下内容放入您的 web.config 文件中:

    <Pages EnableViewState="false" ... />
    

    要禁用特定页面,您可以在页面指令中以声明方式执行此操作:

    <%@ Page EnableViewState=”false”
    

    或以编程方式在页面事件中:

    private void Page_Init(object sender, System.EventArgs e)
    {
        this.EnableViewState = false;
    }
    

    最后,要禁用特定控件的视图状态,您可以使用以下命令:

    <asp:datagrid EnableViewState="false" ... />
    

    请记住,某些控件在关闭视图状态时将无法正常工作。有时,您可以为特定控件保持启用视图状态,但通过仔细确定 ASP.Net 事件管道中填充控件的位置来最小化视图状态负载的大小。您可以阅读此excellent reference 了解更多信息。

    【讨论】:

    • 我尝试了所有这些。但是页面重新加载后我的控制仍然有值。
    【解决方案5】:

    将页面上的ViewStateMode设置为Disabled,省略EnableViewState。您可以将其设置为启用某些控件(默认为Inherit)。

    编辑(旁注,也见 cmets):

    正如我们在评论中所讨论的,即使 ViewState 被禁用,文本框也会保持其值。这是真的,因为它们是 HTTP POST 请求的元素。例如,标签不会呈现为span 标签。

    在下面的示例代码中,有一个用随机数填充的标签。如果将ViewStateMode 设置为Enabled,则来自最后一个请求的随机数将写入调试输出窗口。如果将ViewStateMode 设置为Disabled,则会写入一个空字符串。 Label 的状态不会保留:

    <%@ Page Language="C#"
        AutoEventWireup="true"
        CodeBehind="Default.aspx.cs"
        Inherits="WebApplication2.Default"
        ViewStateMode="Disabled" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
            <title></title>
        </head>
        <body>
            <form id="form1" runat="server">
                <asp:TextBox runat="server" ID="textbox" Text="Default" />
                <asp:Label runat="server" ID="randomNumberLabel" />
                <asp:Button runat="server" Text="Click Me" />
            </form>
        </body>
    </html>
    

    这是后面的代码。请务必附加调试器:

    namespace WebApplication2
    {
        public partial class Default : System.Web.UI.Page
        {
            private readonly static Random rnd = new Random();
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if(this.IsPostBack)
                    Debug.WriteLine(this.randomNumberLabel.Text);
    
                this.randomNumberLabel.Text = rnd.Next(Int32.MaxValue).ToString();
            }
        }
    }
    

    我希望我设法澄清了差异。

    【讨论】:

    • 我尝试了你的解决方案,但是当我看到源代码时,我又看到了视图状态。当我的页面重新加载时,我的文本框再次有价值。
    • 你是对的。我想这是 Tim 提到的控制状态。但是,我不确定是否诚实。无论如何,文本框确实保留了它们的文本,因为它们是 HTML 表单元素。它们的内容直接回传到服务器,而不是装箱在 ViewState 中。我写了一些示例代码,我会编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2010-10-26
    • 2013-01-16
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多