ASP.NET DropDownList和ViewState

4

我有一个下拉列表,它会触发自动回传并触发SelectedIndexChanged更改事件。我已将ViewState设置为true,但由于某种原因,在回传之间选定的值未被保留。我已经使用过下拉列表数百次,但似乎无法弄清楚为什么会发生这种情况。下拉列表中的项是通过声明性编码实现的,例如:

<asp:DropDownList ID="SitePrefDropDownList" runat="server" AutoPostBack="True" 
onselectedindexchanged="SitePrefDropDownList_SelectedIndexChanged" EnableViewState="true">
    <asp:ListItem Value="Proffesional">Proffesional</asp:ListItem>
    <asp:ListItem Value="Colorful">Colorful</asp:ListItem>
</asp:DropDownList> 

任何想法。我被难住了。
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Proffesional.master" AutoEventWireup="true" EnableViewState="true"
CodeFile="Home.aspx.cs" Inherits="_Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:Label ID="Label1" runat="server" Text="User Name: "></asp:Label>
<asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox>
<br />
<br />
<asp:Label ID="Label2" runat="server" Text="Color Scheme: ">
</asp:Label><asp:DropDownList ID="SitePrefDropDownList" runat="server" 
AutoPostBack="True" 
onselectedindexchanged="SitePrefDropDownList_SelectedIndexChanged" EnableViewState="true">
    <asp:ListItem Value="Proffesional">Proffesional</asp:ListItem>
    <asp:ListItem Value="Colorful">Colorful</asp:ListItem>
</asp:DropDownList>
<br />
<br />
<asp:Button ID="OKButton" runat="server" Text="OK" onclick="OKButton_Click" />
</asp:Content>

这是代码的后台。
 public partial class _Default : System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e) {
    if (Session["Template"] != null) {
        string MasterPage = String.Format("~/{0}.master", (string)Session["Template"]);
        MasterPageFile = MasterPage;
    }
}

protected void Page_Load(object sender, EventArgs e){
}

protected void OKButton_Click(object sender, EventArgs e) {
    if (UserNameTextBox.Text.Length != 0) {
        Session["UserName"] = UserNameTextBox.Text;
        Label Welcome = (Label)Master.FindControl("GreetingLabel");
        Welcome.Text = String.Format("Welcome, {0}!", Session["UserName"]);
    }
}

protected void SitePrefDropDownList_SelectedIndexChanged(object sender, EventArgs e) {
    Session["Template"] = SitePrefDropDownList.SelectedValue;
    Server.Transfer(Request.Path);
}
}

你在哪里检查所选的值? - ub1k
我无法理解。DDL 触发了 "selectedindexchanged" 事件,但在 postbacks 之间没有保留所选值。你能确认这是真的吗? - Nika G.
这个DropDownList是否在任何数据绑定的容器中,例如GridView、FormView、UserControl等,并且在事件触发之前是否调用了它的DataBind(例如缺少IsPostBack检查)? - Tim Schmelter
你为什么要执行 Server.Transfer(Request.Path); - Graham Clark
重新加载页面以使用新选择的主页。我正在跟随教程。 - Richard Banks
显示剩余3条评论
4个回答

2
我能想到的唯一原因是你在页面加载事件中设置了一些默认值,例如...
protected void Page_Load(object sender, EventArgs e)
{
    SitePrefDropDownList.SelectedValue = "Proffesional";
}

在页面生命周期中,当触发 SitePrefDropDownList_SelectedIndexChanged 事件之前,首先会调用 Page_load 事件,此时默认/旧值将被重置。 编辑:您的页面加载应该这样设置值...
if (!Page.IsPostback)
{
   SitePrefDropDownList.SelectedValue = "Proffesional";
}

不需要了,我已经检查过了。我也检查了下拉列表本身的加载事件。两者都没有问题。 - Richard Banks
请问您能否发布完整的页面加载和表单设计代码? - Muhammad Akhtar
请注意:如果这是正确的答案,我建议添加解决方案:if (!Page.IsPostback) {} - Tim Schmelter
@Richard Banks:你能告诉我最终你找到了什么吗? - Muhammad Akhtar

1

你在页面上禁用了ViewState吗?

即使控件本身启用了ViewState,如果页面禁用了ViewState,则不会为页面上的任何控件记录ViewState - 请参阅MSDN上关于Page.EnableViewState Property的文档。

检查一下页面的EnableViewState属性是否已被禁用,无论是在.aspx文件中还是在代码后台中:

// Any statements that look like this could be the source of your woes
this.EnableViewState = false;
Page.EnableViewState = false;

<%@ Page EnableViewState="false" ...

你在你的端测试过了吗?我已经在页面级别上禁用了视图状态,但对我来说仍然可以正常工作。 - Muhammad Akhtar
EnableViewState在masterpage、contentpage和控件本身上都是true的。 - Richard Banks

1

更改主页面会导致此类型的错误。 在 preinit 方法中将 masterpagefilename 保存在会话中,并在 postbacks 中设置它。

protected override void OnPreInit(EventArgs e)
{
    if (!IsPostBack)
    {
        this.MasterPageFile = "../../04.07.ManifestoKontrol.Web/ManifestoKontrolMasterPage.master";
        Session[String.Concat(DefaultMasterPageSessionVariableName, this.ClientID)] = this.Master.AppRelativeVirtualPath;
        base.OnPreInit(e);
    }
    else
    {
        if (Session[String.Concat(DefaultMasterPageSessionVariableName, this.ClientID)] != null)
            this.MasterPageFile = Session[String.Concat(DefaultMasterPageSessionVariableName, this.ClientID)].ToString();
    }
}

你能否在OnPreInit中编写这个语句this.MasterPageFile,因为我遇到了这个错误"The 'MasterPageFile' property can only be set in or before the 'Page_PreInit' event."。 - Chirag

0

你看到了吗,不要混淆值和文本?

 <asp:ListItem Text="20" Value="20" Selected="True" />
 <asp:ListItem Text="50" Value="20" Selected="False" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接