如何为动态创建的控件禁用ViewState?

时间:2008-10-24 17:40:45

标签: asp.net

我似乎无法为我动态添加到页面的控件禁用ViewState。

ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Page1.aspx.cs" Inherits="Page1" EnableViewState="false" %>
...
<asp:PlaceHolder ID="DropDownPlaceHolder" runat="server" EnableViewState="false" />
<asp:Button ID="Submit" runat="server" OnClick="Submit_OnClick" Text="Click Me!"  EnableViewState="false"/>
...

ASPX.CS

protected override void OnInit(EventArgs e)
{
    DropDownList dropDown = new DropDownList();
    TextBox textBox = new TextBox();

    textBox.EnableViewState = false;

    dropDown.Items.Add("Apple");
    dropDown.Items.Add("Dell");
    dropDown.Items.Add("HP");

    dropDown.AutoPostBack = true;
    dropDown.EnableViewState = false;

    DropDownPlaceHolder.Controls.Add(dropDown);
    DropDownPlaceHolder.Controls.Add(textBox);

    base.OnInit(e);
}

如果我无法在这些控件上禁用ViewState,那么我永远无法以编程方式覆盖用户输入/选择的内容。

我已尝试将此代码放在OnInit和Page_Load中,但在任一位置的效果都相同 - 启用了ViewState(DropDownList维护选定的值,TextBox保留输入的文本)。

那么,如何禁用ViewState并防止它填充这些控件?

谢谢!


感谢您的回复。 不幸的是,在我的情况下,这不是一个可行的解决方案。

我将基于配置文件动态加载控件,其中一些控件将加载子控件。

我需要能够单独关闭控件的ViewState,而不需要在不同的地方加载控件的代码逻辑(在OnInit与LoadComplete中)  法)。

4 个答案:

答案 0 :(得分:3)

  

@This Mat

     

似乎帖子(后面)会发送所选的值,即使控件的视图状态已关闭。

是。帖子将始终发送控件选定/当前值。这是HTTP表单发布的行为,与ASP.NET控件/视图状态无关。

答案 1 :(得分:2)

您看到的是{。3}}与.Net Framework 2.0一起引入的内容。它旨在存储控件的绝对最小信息,例如DropDownList中的选择和TextBox中的文本。仅与外观相关的属性(例如BackColor)仍保留在ViewState中。

ViewState ControlState不同。

我只能假设这是为了避免最终用户的混淆,如果他们在没有理解后果的情况下禁用ViewState时控件不能执行预期的操作。

答案 2 :(得分:1)

这是一个“功能” - http://support.microsoft.com/?id=316813

谢谢,微软!!

答案 3 :(得分:0)

我测试了一下,发现它有点奇怪。似乎帖子(后面)将发送所选的值,即使控件的视图状态已关闭。

我确实找到了一个很好的解决方案,如果你在init和load之后处理所有内容,你将在viewstate处理完毕后重新加载你的控件,然后重置值。

我使用了LoadComplete事件,例如:

 Public Sub Page_In(ByVal sender As Object, ByVal e As EventArgs) _ 
 Handles Me.LoadComplete

    Dim ddl As New DropDownList()
    ddl.EnableViewState = False
    ddl.Items.Add("Hello")
    ddl.Items.Add("Stackoverflow")

    phTest.Controls.Add(ddl)

End Sub

希望这有帮助。