如何将数据绑定下拉列表中的选定项目置于会话状态?

Posted

技术标签:

【中文标题】如何将数据绑定下拉列表中的选定项目置于会话状态?【英文标题】:How to place selected item from data bound drop down list in session state? 【发布时间】:2015-08-04 16:34:56 【问题描述】:

我想以会话状态存储来自两个页面的多条数据,并将它们显示在第三页上的单独标签中。我可以从第一页的文本框中检索数据,但是当我尝试从会话状态的第二页上的下拉列表(连接到数据库)中检索所选值时,我的程序会停止。

这是第一页后面的代码。 它工作正常,我可以在第三页标签上显示这些元素。

public partial class booking : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    

    

    protected void btnBookingContinue_Click(object sender, EventArgs e)
    
        Session["firstName"] = tbxFirstName.Text;
        Session["lastName"] = tbxLastName.Text;
        Session["country"] = tbxCountry.Text;
        Session["phone"] = tbxPhone.Text;
        Session["email"] = tbxEmail.Text;

        Server.Transfer("~/booking2.aspx");
    

这是第二页的内容,显示了我拥有的元素和数据连接。

<ul class="bookingForm">
                <li>
                    <h2>Booking Form:</h2>
                </li>
                <li>
                    <asp:Label ID="lblChoosePackage" runat="server" Text="Choose Package:" CssClass="bookinglabel"></asp:Label>
                    <asp:DropDownList ID="ddlChoosepackage" runat="server" DataSourceID="ChoosePackageList" DataTextField="Title" DataValueField="Title" CssClass="bookingdropdown" OnSelectedIndexChanged="ddlChoosepackage_SelectedIndexChanged"></asp:DropDownList>
                    <asp:SqlDataSource ID="ChoosePackageList" runat="server" ConnectionString="<%$ ConnectionStrings:FlorianopoliSurfConnection %>" SelectCommand="SELECT [Title] FROM [Package] ORDER BY [PackageID]"></asp:SqlDataSource>
                </li>
                <li>
                    <asp:Label ID="lblArrivalDate" runat="server" Text="Arrival Date:" CssClass="bookinglabel"></asp:Label>
                    <asp:TextBox ID="tbxArrivaldate" runat="server" CssClass="bookingtextbox"></asp:TextBox>
                </li>
                <li>
                    <asp:Label ID="lblPeople" runat="server" Text="Number Of People:" CssClass="bookinglabel"></asp:Label>
                    <asp:TextBox ID="tbxPeople" runat="server" CssClass="bookingtextbox"></asp:TextBox>
                </li>
                <li>
                    <asp:Label ID="lblDeparture" runat="server" Text="Departure Location:" CssClass="bookinglabel"></asp:Label>
                    <asp:DropDownList ID="ddlDeparture" runat="server" CssClass="bookingdropdown">
                        <asp:ListItem Selected="True">Dublin</asp:ListItem>
                        <asp:ListItem>Cork</asp:ListItem>
                        <asp:ListItem>Shannon</asp:ListItem>
                        <asp:ListItem>Belfast</asp:ListItem>
                    </asp:DropDownList>
                </li>
                <li>
                    <asp:Label ID="lblCreditCard" runat="server" Text="Credit Card:" CssClass="bookinglabel"></asp:Label>
                    <asp:TextBox ID="tbxCreditCard" runat="server" CssClass="bookingtextbox"></asp:TextBox>
                </li>
                <li>
                    <asp:Button ID="btnContinueToSummary" runat="server" Text="Continue" PostBackUrl="~/confirmBooking.aspx" OnClick="btnContinueToSummary_Click" />
                </li>
            </ul>

这是第二页后面的代码。

public partial class booking2 : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)
        
            ddlChoosepackage.SelectedIndex = 0;
        
    

    protected void ddlChoosepackage_SelectedIndexChanged(object sender, EventArgs e)
    
        if (ddlChoosepackage.SelectedIndex != 0)
        
            Session["choosePackage"] = ddlChoosepackage.SelectedItem.Value;
        

    

    protected void btnContinueToSummary_Click(object sender, EventArgs e)
    
        //Session["choosePackage"] = ddlChoosepackage.SelectedItem;
        Session["arrivalDate"] = tbxArrivaldate.Text;
        Session["numOfPeople"] = tbxPeople.Text;
        Session["departure"] = ddlDeparture.SelectedItem;
        Session["creditCard"] = tbxCreditCard.Text;

        Response.Redirect("~/confirmBooking.aspx");
    

这是第三页的代码。 我被抓住的路线是:

string package = (string)Session["choosePackage"];

我得到错误:

对象引用未设置为对象的实例。

所以我似乎从下拉列表或下拉列表的会话变量中获得了一个空值。

毫无疑问,这里有一个菜鸟错误。

public partial class confirmBooking : System.Web.UI.Page

    public void Page_Load(object sender, EventArgs e)
    
        if (Request.Cookies["CurrencySelection"] != null)
        
            HttpCookie cookie = Request.Cookies["CurrencySelection"];
            ddlChooseCurrency.SelectedItem.Text = Server.htmlEncode(cookie.Value);
        

        string firstName = (string)Session["firstName"];
        string lastName = (string)Session["lastName"];
        string country = (string)Session["country"];
        string phoneNumber = (string)Session["phone"];
        string email = (string)Session["email"];

        string package = (string)Session["choosePackage"];
        string arrivalDate = (string)Session["arrivalDate"];
        string numOfPeople = (string)Session["numOfPeople"];
        string departure = (string)Session["departure"];
        string creditCard = (string)Session["creditCard"];

        lblSummaryNameDisplay.Text = string.Format("0 1", firstName, lastName);
        lblSummaryCountryDisplay.Text = string.Format("0", country);
        lblSummaryPhoneDisplay.Text = string.Format("0", phoneNumber);
        lblSummaryEmailDisplay.Text = string.Format("0", email);

        lblSummaryPackageDisplay.Text = package.ToString();
        lblSummaryArrivalDateDisplay.Text = arrivalDate.ToString();
        lblSummaryPeopleDisplay.Text = numOfPeople.ToString();
        lblSummaryDepartureDisplay.Text = departure.ToString();
        lblSummaryCardDisplay.Text = creditCard.ToString();

    

【问题讨论】:

您是否尝试过使用SelectedItem.Text.SelectedValue 您是否设置了断点并确认使用所选值正确设置了会话? NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。 嗨约翰桑德斯,谢谢你,我会调查的。 【参考方案1】:

我认为问题在于当您在Page_Load 上设置SelectedIndex 时,SelectedIndexChanged 事件不会触发。我之前也遇到过类似的问题,请尝试调整您的Page_Load 事件...

        if (!IsPostBack)
        
            ddlChoosepackage.DataBind();
            ddlChoosepackage.SelectedIndex = 0;
        

【讨论】:

感谢您的回复。我尝试了 SelectedItem.Text 和 SelectedValue 的不同变体,但似乎没有任何效果。 谢谢 TestWell 我已经实现了你的建议,但是在插入断点之后它显示我的 ddlChoosepackage.SelectedIndex 是 -1 即使在 if 语句之后。 我相信在页面被物理绘制之前,SelectedIndex 只能是 -1。 Session["choosePackage"] = ""; 在您的加载事件中有什么帮助吗?然而,用户必须实际单击一个选择。你在哪里以及如何填充ddlChoosepackage 嗨,使用上面的代码我得到一个错误:索引超出范围。必须是非负数且小于集合的大小。我的 selectedIndex 保持在 -1,因此似乎没有从下拉列表中选择任何内容。 谢谢,在回复之前我没有看到您的最后一条消息。我正在使用上面第二个代码 sn-p(第二页的 html)中的 SqlDataSource 从数据库中填充下拉列表。那是我认为可能的另一件事..我是否应该(重新)填充第二页的页面加载下拉列表,即使它已连接到数据库?

以上是关于如何将数据绑定下拉列表中的选定项目置于会话状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在下拉列表中显示所选项目名称?

如何将下拉列表中的选定值添加到数据库中?

如何以编程方式在 select2 多选下拉列表中添加其他选择而不会丢失现有的选定项目

Vue.js - 选择/下拉选定项 vm 绑定不起作用(bootstrap-vue)

如何使用 Laravel 在下拉列表中显示数据库中的选定值?

我如何从 mvc 的剑道 ui 网格的下拉列表中获取选定的值