在按下通过OnClick调用方法的按钮后再次运行Page_Load时,变量和表单数据丢失

时间:2013-10-30 18:37:22

标签: c# asp.net visual-studio

我不熟悉C#/ ASP / .NET(随时随地学习),所以除了我目前这样做的问题之外,我很可能会以较低的方式解决这个问题。我会尽量保持清晰(可能过于......)。

我有一个带有文本框的表单,用于列入服务器主机名,由换行符分隔。按下提交按钮后,它将使用PostBackUrl="~/btil_Info.aspx"。在btil_info.aspx.cs代码隐藏中,我使用以下内容从Page_Load()中的上一个表单获取所述文本框(hostnames_tb)中的信息:

string hostnames = ((TextBox)Page.PreviousPage.FindControl("hostnames_tb")).Text;

在Page_Load()中,我遍历这个主机名列表并构建一个包含每个主机的几个字段的表单(一些文本框和每个主机的下拉菜单)。填写完这些字段后,按下这里调用Submit_Click()的提交按钮,在同一代码隐藏中,页面似乎重新加载,因为在执行Submit_Click()之前再次调用Page_Load。这样做,填充的表单数据将丢失,主机名列表也将丢失。

在开发的早期阶段,我在第一个表单页面上都有这个,并且提交按钮没有调用PostBackURL,它只是调用Submit_Click(),它工作得很好。页面没有重新加载,表单保留在页面上,我没有丢失数据。但就像现在一样,按钮的工作方式相同。唯一的区别(我看到)是通过上一个调用PostBackURL的表单来访问这个麻烦的页面。

我不相信任何事情应该要求页面刷新/重新加载。只要表单数据被发布,并且只要前一个表单中的主机名列表也可以检索,我实际上并不关心页面是否刷新/重新加载。我只需要能够访问表单数据和主机名列表,以便我可以将其传递给我将更新SharePoint列表的另一种方法(该部分的代码已经在工作)。我尝试在第二个代码隐藏(btil_Info.aspx.cs)中将hostnames字符串作为类变量,并在页面加载时尽快设置它,如果它是空的,但显然它不会在页面重新加载时保持不变并被设置回null。

以下是一些代码片段,我希望能提供一些帮助:

第一页,add_BTIL.aspx:

<form id="form1" runat="server">
<div>
    <asp:TextBox ID="hostnames_tb" runat="server" Rows="20" TextMode="MultiLine" Width="225px"></asp:TextBox>
    <br />
    <asp:Button ID="Submit" runat="server" PostBackUrl="~/btil_Info.aspx" Text="Submit" />
    <br />
    <asp:Literal ID="result" runat="server"></asp:Literal>
    <br /><br />
    <textarea id="hostnames_textarea" cols="25" rows="20" name="hostnames" title="Hostnames"></textarea></div>
</form>

第一页代码隐藏,add_BTIL.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{

}

protected void Submit_Click(object sender, EventArgs e)
{
    string hostnames = hostnames_tb.Text;
    /*
     * Etc.
     */
}

第二页,btil_Info.aspx:

<form id="hosts_form" runat="server">
    <p>
        <asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" Height="26px" UseSubmitBehavior="False" /><br />
        <asp:Literal ID="result" runat="server"></asp:Literal><br />
    </p>
    <br />
</form>

^在这种形式中,我在搜索中的某处读到UseSubmitBehavior="False"会阻止页面重新加载,但它没有帮助。无论如何我没有在我的早期版本中使用它,并且没有这个问题。

第二页代码隐藏,btil_Info.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    string hostnames = ((TextBox)Page.PreviousPage.FindControl("hostnames_tb")).Text;
    // etc.....
}

protected void Submit_Click(object sender, EventArgs e)
{
    // etc.....
}

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您从add_BTIL.aspx发布到btil_Info.aspx,那么将永远不会调用add_BTIL.aspx.cs文件中的Submit_Click函数。

根据您为btil_Info.aspx页面提供的有限标记... 如果您没有在表单id =“hosts_form”内的服务器控件内部呈现主机名列表,那么当您点击提交按钮时,将不会将任何内容发布到您的Submit_Click函数。

我个人不喜欢从一个页面发布到另一个页面,所以这里有一些建议。

如果您想要执行多页向导,那么您可以考虑使用asp.net wizard control。 或者如果你想保持简单,使用两个asp Panel controls并显示第一个,发布数据,然后隐藏第一个并显示第二个。