从PreviousPage.FindControl获取值

3
我正在尝试创建一个预订表的确认页面。但我遇到了问题,无法从之前的页面控件中获取值。我已将所有内容运行在服务器上,并将提交按钮的PostBackURL指向确认页面。一切都编译通过,但当我输入信息并点击提交后,唯一弹出的是我的布尔值,这些布尔值并不能真正反映其价值,因为我的if-else语句。我尝试了很多不同的类型转换/值抓取方法,而这种形式是我最接近的方式。任何帮助都将不胜感激。 此外,在String.format中如何换行?\n似乎不起作用。 确认页面看起来像这样:
ConfirmationPage.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
            string numNights = Convert.ToString((TextBox)PreviousPage.FindControl("txtNights.Text"));
            string arrivalDate = Convert.ToString((TextBox)PreviousPage.FindControl("txtArrivalDate.Text"));
            string numAdults = Convert.ToString((DropDownList)PreviousPage.FindControl("ddlAdults.SelectedValue.Text"));
            string numChildren = Convert.ToString((DropDownList)PreviousPage.FindControl("ddlChildren.SelectedValue.Text"));
            string roomTypeBusiness = "false";
            string roomTypeSuite = "false";
            string roomTypeStandard = "false";
            string bedTypeKing = "false";
            string bedTypeDouble = "false";
            string smokingOption = "false";

            if (Convert.ToBoolean(PreviousPage.FindControl("rdoBusiness.Checked")))
                roomTypeBusiness = "true";
            else if (Convert.ToBoolean(PreviousPage.FindControl("rdoSuite.Checked")))
                roomTypeSuite = "true";
            else
                roomTypeStandard = "true";

            if (Convert.ToBoolean(PreviousPage.FindControl("rdoKing.Checked")))
                bedTypeKing = "true";
            else
                bedTypeDouble = "true";

            string specialRequests = Convert.ToString((TextBox)PreviousPage.FindControl("txtSpecialRequests.Text"));
            string name = Convert.ToString((TextBox)PreviousPage.FindControl("txtName.Text"));
            string email = Convert.ToString((TextBox)PreviousPage.FindControl("txtEmail.Text"));

            lblResults.Text = String.Format("Arrival Date: {0} \r\n Number of Nights: {1} \n Number of Adults: \r {2} Number of Children: {3} Business Room: {4} Suite Room: {5} Standard Room: {6} King Bed: {7} Double Bed: {8} Smoking: {9} Special Requests: {10} Name: {11} E-mail: {12}",
            arrivalDate, numNights, numAdults, numChildren, roomTypeBusiness, roomTypeSuite, roomTypeStandard, bedTypeKing, bedTypeDouble, smokingOption, specialRequests, name, email);
    }
}

上一个页面的 ASPX 是:

<%@ Page Title="" Language="C#" MasterPageFile="~/ResultsPageHTML5MasterPage/ResultsPageHTML5MasterPage.master" AutoEventWireup="true" CodeFile="ReservationForm_SqlInject.aspx.cs" Inherits="Default3" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <h1>My Home Away From Home Hotels</h1>
        <h2>Where you&rsquo;re always treated like family</h2>
    <p>
        Arrival date: &nbsp;

        <asp:TextBox ID="txtArrivalDate" runat="server" Width="75px">TextBoxHere</asp:TextBox>
        &nbsp;

        <asp:ImageButton ID="ibtnCalendar" runat="server" ImageAlign="Top" ImageUrl="~/Images/Calendar.bmp" OnClick="ibtnCalendar_Click" />
    </p>
    <p>
        <asp:Calendar ID="clnArrival" runat="server" Visible="False" 
            OnSelectionChanged="clnArrival_SelectionChanged" BackColor="White" 
            BorderColor="Black" DayNameFormat="Shortest" Font-Names="Times New Roman" 
            Font-Size="10pt" ForeColor="Black" Height="220px" NextPrevFormat="FullMonth" 
            TitleFormat="Month" Width="400px">
            <DayHeaderStyle BackColor="#CCCCCC" Font-Bold="True" Font-Size="7pt" 
                ForeColor="#333333" Height="10pt" />
            <DayStyle Width="14%" />
            <NextPrevStyle Font-Size="8pt" ForeColor="White" />
            <OtherMonthDayStyle ForeColor="#999999" />
            <SelectedDayStyle BackColor="#CC3333" ForeColor="White" />
            <SelectorStyle BackColor="#CCCCCC" Font-Bold="True" Font-Names="Verdana" 
                Font-Size="8pt" ForeColor="#333333" Width="1%" />
            <TitleStyle BackColor="Black" Font-Bold="True" Font-Size="13pt" 
                ForeColor="White" Height="14pt" />
            <TodayDayStyle BackColor="#CCCC99" />
        </asp:Calendar>
    </p>
    <p>
        Number of nights: &nbsp;
        <asp:TextBox ID="txtNights" runat="server" Width="45px"></asp:TextBox>
    </p>
    <p>
        Number of Adults: &nbsp;
        <asp:DropDownList ID="ddlAdults" runat="server" Width="50px"></asp:DropDownList>
        &nbsp;&nbsp;
        Number of Children: &nbsp;
        <asp:DropDownList ID="ddlChildren" runat="server" Width="50px"></asp:DropDownList>
    </p>
    <h3>Preferences</h3>
    <p>
        Room Type: &nbsp;
        <asp:RadioButton ID="rdoBusiness" runat="server" GroupName="Room" Text="Business" />
        <asp:RadioButton ID="rdoStandard" runat="server" GroupName="Room" Text="Standard" />
        <asp:RadioButton ID="rdoSuite" runat="server" GroupName="Room" Text="Suite" />
    </p>
    <p>
        Bed Type:
        &nbsp;
        <asp:RadioButton ID="rdoKing" runat="server" GroupName="Bed" Text="King" />
        &nbsp;
        <asp:RadioButton ID="rdoDouble" runat="server" GroupName="Bed" Text="Double" />
    </p>
    <p>
        <asp:CheckBox ID="chkSmoking" runat="server" Text="Smoking" />
    </p>

    <p>
        Special Requests
    </p>
    <p>
        <asp:TextBox ID="txtSpecialRequests" runat="server" Rows="4" TextMode="MultiLine" Width="250px"></asp:TextBox>
    </p>
    <h3>Contact Information</h3>
    <p>Name:
    </p>

    <p>
        <asp:TextBox ID="txtName" runat="server" Width="320px"></asp:TextBox>
    </p>
    <p>
        Email
    </p>
    <p>
        <asp:TextBox ID="txtEmail" runat="server" Width="320px"></asp:TextBox>
    </p>

    <asp:Button ID="btnSubmit" runat="server" Text="Submit" 
         Width="80px" PostBackUrl="~/ConfirmationPage.aspx" />
    &nbsp;
    <asp:Button ID="btnClear" runat="server" Text="Clear" Width="80px" OnClick="btnClear_Click" />

    <p>
        <asp:Button ID="btnInstert" runat="server" Text="Insert" OnClick="btnInstert_Click" Width="80px" />
    </p>
    <p>
        <asp:Label ID="lblMessage" runat="server" Text="Label"></asp:Label>
    </p>
</asp:Content>

我认为你应该将值存储到某些Session中,或者对于小数据块,可以使用Querystring,并在其他页面上使用它们,而不是使用PreviousPage.FindControl - Dhrumil
2个回答

2
使用PreviousPage.FindControl()只能在从页面A -> 转移数据 -> 页面B导航时访问PreviousPage数据。如果直接请求页面,则PreviousPage将呈现空引用。

在您的情况下,一旦导航到页面Default2,您仅在页面加载时保留值。单击提交后,Default.aspx调用自身,并且PreviousPage失去了其数据。此外,您查找控件的方式是不正确的,这样您将得到NULLREFERENCE

更多信息

如果您的Web应用程序中有一个主页,则不能通过调用PreviousPage.FindControl()直接访问先前的页面控件,而必须首先找到驻留在主页中的ContentHolder控件,然后才能在子网页中查找子控件。

解决方案:

使用IsPostBack属性

我如何在JavaScript中获取due_date的值?

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string numNights = Convert.ToString(((TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtNights")).Text);
            string arrivalDate = Convert.ToString(((TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtArrivalDate")).Text);
            string numAdults = Convert.ToString(((DropDownList)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("ddlAdults")).SelectedValue);
            string numChildren = Convert.ToString(((DropDownList)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("ddlChildren")).SelectedValue);
            string roomTypeBusiness = "false";
            string roomTypeSuite = "false";
            string roomTypeStandard = "false";
            string bedTypeKing = "false";
            string bedTypeDouble = "false";
            string smokingOption = "false";

            if (Convert.ToBoolean(((RadioButton)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("rdoBusiness")).Checked"))
                roomTypeBusiness = "true";
            else if (Convert.ToBoolean(((RadioButton)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("rdoSuite")).Checked"))
                roomTypeSuite = "true";
            else
                roomTypeStandard = "true";

            if (Convert.ToBoolean(((RadioButton)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("rdoKing")).Checked))
                bedTypeKing = "true";
            else
                bedTypeDouble = "true";

            string specialRequests = Convert.ToString(((TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtSpecialRequests")).Text);
            string name = Convert.ToString(((TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtName")).Text);
            string email = Convert.ToString(((TextBox)PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtEmail")).Text);

            /* Splitting data into newline */

            string info = String.Format("Arrival Date: {0}, Number of Nights: {1}, Number of Adults: {2}, Number of Children: {3}, Business Room: {4}, Suite Room: {5}, Standard Room: {6}, King Bed: {7}, Double Bed: {8}, Smoking: {9}, Special Requests: {10}, Name: {11}, E-mail: {12}",
            arrivalDate, numNights, numAdults, numChildren, roomTypeBusiness, roomTypeSuite, roomTypeStandard, bedTypeKing, bedTypeDouble, smokingOption, specialRequests, name, email);

            String[] tokens = info.Split(new[]{","}, StringSplitOptions.RemoveEmptyEntries);
            lblResults.Text = string.Join("<br />", tokens);        
            }
        }
    }

当我尝试这样做时,我会得到“错误1:'System.Web.UI.Control'不包含'Text'的定义,并且没有接受类型为'System.Web.UI.Control'的第一个参数的扩展方法'Text'可以找到(您是否缺少使用指令或程序集引用?)” - Andrew-Saarima
你的网页应用程序中是否使用了主页面? - Suprabhat Biswal
是的,我是。而且我会第一个承认我对它一无所知。这是为了课程,我基本上盲目地遵循老师的主页指示。 - Andrew-Saarima
1
我已经更新了我的答案。如果你的ContentPlaceHolder控件应该有ID为ContentPlaceHolder1,那么就使用相同的ID,否则将ContentPlaceHolder1更改为正确的ID。 - Suprabhat Biswal
是的,就是这样!你真是救了我一命!谢谢! - Andrew-Saarima
显示剩余2条评论

0

你的代码不正确。你必须使用controlId,然后将控件转换为正确的类型,然后使用相应的属性。此外,对于下拉列表,你必须使用SelectedItem.Text而不是SelectedValue.Text。

以下是修改后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default2 : System.Web.UI.Page
{
        protected void Page_Load(object sender, EventArgs e)
        {
            string numNights = Convert.ToString(((TextBox)PreviousPage.FindControl("txtNights")).Text);
            string arrivalDate = Convert.ToString(((TextBox)PreviousPage.FindControl("txtArrivalDate")).Text);

            string numAdults = Convert.ToString(((DropDownList)PreviousPage.FindControl("ddlAdults")).SelectedItem.Text);
            string numChildren = Convert.ToString(((DropDownList)PreviousPage.FindControl("ddlChildren")).SelectedItem.Text);
            string roomTypeBusiness = "false";
            string roomTypeSuite = "false";
            string roomTypeStandard = "false";
            string bedTypeKing = "false";
            string bedTypeDouble = "false";
            string smokingOption = "false";

            if (Convert.ToBoolean(((RadioButton)PreviousPage.FindControl("rdoBusiness")).Checked))
                roomTypeBusiness = "true";
            else if (Convert.ToBoolean(((RadioButton)PreviousPage.FindControl("rdoSuite")).Checked))
                roomTypeSuite = "true";
            else
                roomTypeStandard = "true";

            if (Convert.ToBoolean(((RadioButton)PreviousPage.FindControl("rdoKing")).Checked))
                bedTypeKing = "true";
            else
                bedTypeDouble = "true";

            string specialRequests = Convert.ToString(((TextBox)PreviousPage.FindControl("txtSpecialRequests")).Text);
            string name = Convert.ToString(((TextBox)PreviousPage.FindControl("txtName")).Text);
            string email = Convert.ToString(((TextBox)PreviousPage.FindControl("txtEmail")).Text);

            lblResults.Text = String.Format("Arrival Date: {0} \r\n Number of Nights: {1} \n Number of Adults: \r {2} Number of Children: {3} Business Room: {4} Suite Room: {5} Standard Room: {6} King Bed: {7} Double Bed: {8} Smoking: {9} Special Requests: {10} Name: {11} E-mail: {12}",
            arrivalDate, numNights, numAdults, numChildren, roomTypeBusiness, roomTypeSuite, roomTypeStandard, bedTypeKing, bedTypeDouble, smokingOption, specialRequests, name, email);
        }

}

当我尝试这种方式时,我会收到一个“在 App_Web_stp3fzm4.dll 中发生了类型为 'System.NullReferenceException' 的一次首次机会异常”错误。 - Andrew-Saarima
只有当某人从您的应用程序中的其他页面导航到此页面时,PreviousPage属性才具有值。并且请确保两个页面都启用了ViewState。 - Avinash Jain
我运行了我的ReservationForm(我更新了原始问题以显示),并填写了所有信息,然后单击提交按钮,该按钮具有PostBackUrl到我的ConfirmationPage.aspx。我在哪里启用ViewState? - Andrew-Saarima

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