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

本文关键字:变量 Load Page 表单 数据 运行 OnClick 调用 方法 按钮 | 更新日期: 2023-09-27 18:37:27

我不熟悉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.....
}

非常感谢任何帮助!

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

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

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

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

如果要执行多页向导,则可以考虑 asp.net 向导控件。或者,如果要保持简单,请使用两个 asp Panel 控件并显示第一个,提交数据,然后隐藏第一个并显示第二个。