将数据从一个页面发送到另一个页面

7

我试图使用C# ASP.Net将表单数据从一个页面发送到另一个页面。我有两个页面default.aspx 和 default2.aspx。以下是default.aspx中的代码:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<br />
<asp:Button ID="Button1" runat="server" Text="Go" 
    PostBackUrl="~/Default2.aspx" />
<br />

据我所知,PostBackUrl 用于设置要发送数据的页面,这个理解正确吗?

另外,我该如何检索发送到 Default2.aspx 的数据?

5个回答

25
您有几种选择,请考虑:
  1. 会话状态
  2. 查询字符串
会话状态 如果您要在页面之间发送数据,可以考虑使用会话状态
ASP.NET会话状态允许您在Web应用程序中的用户浏览ASP.NET页面时存储和检索值。HTTP是一种无状态协议。这意味着Web服务器将每个页面的HTTP请求视为独立请求。服务器不保留在先前请求期间使用的变量值的任何知识。ASP.NET会话状态将同一浏览器的请求标识为会话,在有限时间窗口内提供一种持久化变量值的方法。默认情况下,对所有ASP.NET应用程序启用ASP.NET会话状态。
最重要的是,它非常容易!
将数据放入(例如在default1.aspx上)。
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

获取它(例如在default2.aspx页面上)

string firstname = Session["FirstName"] // value of FirstNameTextBox.Text;
string lastname = Session["LastName"] // value of LastNameTextBox.Text; 

查询字符串

如果您要发送小量数据(例如id=4),使用查询字符串变量可能更实用。

您应该探索使用查询字符串变量的方法,例如:

http://www.domain.com?param1=data1&param2=data2

你可以像这样获取数据

string param1 = Request.QueryString["param1"]; // value will be data1
string param2 = Request.QueryString["param2"]; // value will be data2
你可以使用类似如何测试Request.QueryString[]变量?的方式来获取数据。
如果你不熟悉查询字符串变量,请查看维基百科上的相关文章

7

会话变量在这种情境下非常有用。

比如说,假设您的文本框包含登录凭据,则将它们保存在会话中,以便稍后可以在任何其他页面中使用。像这样:

在 Button_Click 中 -

Session["name"]=TextBox1.Text;
Session["pwd"]= TextBox2.Text;

你可以使用以下代码替代PostBackUrl="~/Default2.aspx"-

//in button click
Server.Transfer("~/Default2.aspx");

在Default2.aspx页面加载时:
string a= Session["name"].ToString();
string b= Session["pwd"].ToString();

3
在Default2.aspx的Page_Load中尝试这个。
 if (PreviousPage != null)
        {
            if (((TextBox)PreviousPage.FindControl("TextBox1")) != null)
            {
                string txtBox1 = ((TextBox)PreviousPage.FindControl("TextBox1")).Text;
                Response.Write(txtBox1);
            }
        }

是的,您是正确的,如果使用PostBackUrl属性,页面1的数据将会被发送到页面2。

MSDN链接


1
我猜他需要使用Server.Transfer。 - Issa Qandil
当您使用Transfer方法或使用跨页发布将处理从一个ASP.NET页面转移到另一个页面时,原始页面包含可能需要的目标页面的请求信息。您可以使用PreviousPage属性来访问该信息。取自此链接http://msdn.microsoft.com/en-us/library/system.web.ui.page.previouspage.aspx - Issa Qandil
我使用了你的代码,但似乎出现了NullPointerException异常。 - user1525474
@user1525474 在哪里?你能发一些更多的代码吗?只有“我遇到了一个错误”很难提供帮助。 - Thousand
你确定你正在寻找正确的控件吗?FindControl("TextBox1")) <-- TextBox1 应该是前一页上你的文本框的名称。 - Thousand
显示剩余11条评论

2

虽然这里的所有答案都可以工作,但有些并不是最有效的。为什么一个简单/标准的http POST必须调用(昂贵的)服务器端Session呢?

您的代码并没有做任何特殊的事情 - 它只是将一个表单POST到另一个页面。要获取POST的数据,您只需要遍历Request.Form集合。

在设置PostBackUrl之前(如果我没记错的话,是asp.net的第1个版本),跨页POST是通过Server.Transfer和获取对上一页的引用来完成/记录的。但是,有了PostBackUrl,事情回到了基础,应该的方式 - 从一个资源到另一个资源的标准http POST

这里有一个类似的SO线程可能会有帮助。


通过使用PostBackUrl,您需要回到基础知识。 - Issa Qandil
@IssaQandil 是的,ASP.net对于Web并没有引入任何“特殊”的东西(但它确实为开发人员带来了很多好处)。在其核心中,它遵循基本的http原则。Postback只不过是对同一页面进行http POST而已。使用PostBackUrl只是将http POST的目标更改为Web上的其他资源(可以解析/处理POST数据),无论是ASP.Net还是其他网站,同一站点或不同站点都可以。 - EdSF
这就是我在他之前的问题中试图告诉他的,那个问题也在讨论同样的话题,希望他能读懂你的澄清。 - Issa Qandil

1
另一种方法是将数据保存在数据库中,然后在其他页面上获取它:
//update
    string query = "UPDATE table SET col = 'a'";
    SqlCommand command = new SqlCommand(query, connection);
    command.ExecuteScalar();

//select
    string query = "SELECT col FROM table";
    SqlCommand command = new SqlCommand(query, connection);
    string value = command.ExecuteScalar();

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