2011-04-11 39 views
2

为了加快我的网站,我试图禁用viewstate,因为我不认为我在任何地方都使用它。我有一个用户控件在default.aspx中加载(使用LoadControl)的母版页设置。我典型的页面设置将是:Viewstate Disabled - 下拉框不返回值

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

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

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

我也尝试启用Page_Init事件MyControl.ascx使用Page.EnableViewState = True;视图状态,但这也没有帮助。

我想我有些误解了viewstate,请问有人能指点我吗?

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

谢谢。

回答

1

我将假设您使用.NET 4.视图状态是ASP.NET页面框架用于在往返之间保留页面和控件值的方法。

当View State关闭时,它不起作用的原因是因为当您执行PostBack到服务器时该控件再次呈现,这意味着您丢失了选定的值。

它不为你工作时,视图状态是关闭网页,但对控制的原因是为了使这种工作,following conditions must be met

  • EnableViewState属性为页面设置为true。
  • 该控件的EnableViewState属性设置为true。
  • 控件的ViewStateMode属性设置为“已启用”或继承“已启用”设置。

ASP .NET View State Overview

+0

好吧,我使用.NET 2.0(不好意思忘了OP的说),这是否让任何点有什么区别? – webnoob 2011-04-11 14:49:40

+0

如果我没有记错,不应该有所作为。 ASP.NET 4只是为您提供了一些管理ViewState的选项。你还是会需要它开启自己的网页和控制,如果你希望能够找回您的下拉列表中选择的值。如果我是你,我会默认打开它,并在有意义的地方有选择地关闭它。如果您有性能问题,还可以使用其他方法,例如将ViewState保存到数据库。 – BrandonZeider 2011-04-11 15:06:43

+0

如何将它保存到数据库的工作?你可以为此推荐任何文章吗? – webnoob 2011-04-11 15:20:32

0

当你在页面上做过EnableViewState = false;那么你不应该在回发后期待DropdownList.SelectedValue

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

+0

我同意这将是更好,但我有几百控制的,其中大部分并不需要启用它。这就是为什么我想停用并启用我需要的功能。 – webnoob 2011-04-11 14:48:39

2

随着ViewState的关闭,要装载在Page_Load中的值是在列表中不再当你回来后(直到你显然重新加载)。如果您想在没有视图状态的情况下工作,您需要从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"]; 
} 
2

当你设置的ViewState为false下拉需要页面加载之前得到填充 - 这意味着你应该在页面初始化做到这一点。事情是这样的:

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”触发。对于下降的数据后下包含选定值 - 但不是可能的值,所以当它加载后的数据至关重要的是,可能的值是已经存在(或者它不能够集中选定的值)。在发布数据加载之前,还没有设置选定的值。

如果视图状态启用它保存在回发之间检索可能值。