繁体   English   中英

asp.net 下拉列表和视图状态

[英]asp.net dropdownlist and viewstate

我有一个触发自动回发并触发 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);
}
}

我能想到的唯一原因是您在页面加载事件中设置了一些默认值..就像..

protected void Page_Load(object sender, EventArgs e)
{
    SitePrefDropDownList.SelectedValue = "Proffesional";
}

在页面生命周期中触发SitePrefDropDownList_SelectedIndexChanged事件之前,首先调用 Page_load 事件并且您的 Default/Old 值将被重置

编辑:您的页面加载应该设置像..

if (!Page.IsPostback)
{
   SitePrefDropDownList.SelectedValue = "Proffesional";
}

您是否在页面本身上禁用了 ViewState?

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

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

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

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

更改母版页会导致此类错误。 将 masterpagefilename 保存在 session 中,并在 preinit 方法中将其设置为回发。

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();
    }
}

您是否看到值和文本没有错误?:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM