Viewstate已禁用 - 下拉框未返回值

时间:2011-04-11 14:34:17

标签: asp.net viewstate

为了加速我的网站,我试图禁用视图状态,因为我不认为我在任何地方都使用它。我有一个母版页设置,在default.aspx中加载了用户控件(使用LoadControl)。我的典型页面设置是:

Main.master -> Default.aspx -> ControlWrapper.ascx -> MyControl.ascx

我在Default.aspx页面中放了EnableViewState =“false”。现在当我尝试从DropDownList in MyControl.ascx读取一个值时,它会在表单发布时返回空白。首先,这是为什么?我以为我仍然可以从下拉列表中读取值?

然后我尝试在该控件上启用ViewState,但它不起作用。

我还尝试使用Page_InitMyControl.ascx Page.EnableViewState = True;事件{{1}}上启用视图状态,但这也无济于事。

我想我有点误解了观点,有人能指出我正确的方向吗?

p.s我不知道这些信息是否相关,但我在Page_Load事件中动态添加了DropDownList的内容。 (想一想,这可能是问题 - 现在就测试一下。)

感谢。

4 个答案:

答案 0 :(得分:2)

关闭viewstate后,当您回发时,您在Page_Load中加载的值不再在列表中(直到您重新加载它们为止)。如果您想在没有viewstate的情况下工作,则需要从Request.Form中的值设置所选项目。

protected void Page_Load(object sender, System.EventArgs e)
{
    ddlItems.Items.Add(new ListItem("test1", "test1"));
    ddlItems.Items.Add(new ListItem("test2", "test2"));
    ddlItems.Items.Add(new ListItem("test3", "test3"));

    if (Page.IsPostBack)
        ddlItems.SelectedValue = Request.Form["ddlItems"];
}

答案 1 :(得分:2)

当您将ViewState设置为false时,需要在页面加载之前填充下拉列表 - 这意味着您可能应该在页面init处执行此操作。像这样:

protected void Page_Init(object sender, System.EventArgs e)
{
    ddlItems.Items.Add(new ListItem("test1", "test1"));
    ddlItems.Items.Add(new ListItem("test2", "test2"));
    ddlItems.Items.Add(new ListItem("test3", "test3"));
}

然后你应该能够读取加载时的值:

protected void Page_Load(object sender, System.EventArgs e)
{
    someTextBox = ddlItems.SelectedValue;
}

有点背景

在此页面上:Microsofts page cycle

在具有页面循环的图像处,在Init和Load之间触发了方法“ProcessPostData”和“LoadPostData”。下拉列表的后期数据包含所选值 - 但不包含可能的值,因此在加载后期数据时,必要的是可能的值已经存在(或者它将无法设置所选值)。此外,在加载后期数据之前,尚未设置所选值。

如果启用了viewstate,则会在回发之间保存并检索可能的值。

答案 2 :(得分:1)

我假设您正在使用.NET 4. View State是ASP.NET页面框架用于在往返之间保留页面和控制值的方法。

当关闭“视图状态”时它不适合您的原因是因为当您对服务器执行PostBack时再次呈现该控件,这意味着您丢失了所选值。

当View State关闭页面时它不起作用的原因,但是对于控件是因为为了使其起作用,following conditions must be met

  • 页面的EnableViewState属性设置为true。
  • 控件的EnableViewState属性设置为true。
  • 控件的ViewStateMode属性设置为Enabled或继承Enabled设置。

ASP .NET View State Overview

答案 3 :(得分:0)

当您在页面上执行EnableViewState = false;时,您不应该在回发后发现DropdownList.SelectedValue

如果您在特定控件上启用/禁用ViewState而不是通过在页面指令上指定它来禁用整个视图状态,那将会很好。