为了加速我的网站,我试图禁用视图状态,因为我不认为我在任何地方都使用它。我有一个母版页设置,在default.aspx中加载了用户控件(使用LoadControl)。我的典型页面设置是:
Main.master -> Default.aspx -> ControlWrapper.ascx -> MyControl.ascx
我在Default.aspx页面中放了EnableViewState =“false”。现在当我尝试从DropDownList in MyControl.ascx
读取一个值时,它会在表单发布时返回空白。首先,这是为什么?我以为我仍然可以从下拉列表中读取值?
然后我尝试在该控件上启用ViewState,但它不起作用。
我还尝试使用Page_Init
在MyControl.ascx
Page.EnableViewState = True;
事件{{1}}上启用视图状态,但这也无济于事。
我想我有点误解了观点,有人能指出我正确的方向吗?
p.s我不知道这些信息是否相关,但我在Page_Load事件中动态添加了DropDownList的内容。 (想一想,这可能是问题 - 现在就测试一下。)
感谢。
答案 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:
答案 3 :(得分:0)
当您在页面上执行EnableViewState = false;
时,您不应该在回发后发现DropdownList.SelectedValue
。
如果您在特定控件上启用/禁用ViewState
而不是通过在页面指令上指定它来禁用整个视图状态,那将会很好。