【问题标题】:Passing Value from Page to Another Page ASP.net Using VB将值从页面传递到另一个页面 ASP.net 使用 VB
【发布时间】:2021-01-14 22:52:04
【问题描述】:

我只需要将文本框输入数据复制到另一个页面。当我从中选择数据时,我有一个来自 Home.aspx 的 datagridview。它会将行数据显示到文本框。现在我想将数据复制/传递到另一个页面。我怎样才能做到这一点?我尝试了以下代码,但它不起作用。

这是 load_page 上的第二页代码

If Not Page.PreviousPage Is Nothing Then
        Dim SourceTextBox As TextBox
        SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
            TextBox)
        If Not SourceTextBox Is Nothing Then
            Label1.Text = SourceTextBox.Text
        End If
    End If

【问题讨论】:

  • 请同时发布第一页布局 - 如果是这种情况,您说您有一个 Grid,您首先需要找到 GridView,您单击的行,然后在该行上找到 TextBox。您可能会发现在此使用 JS 会更容易。
  • 简单地将TextBox1的值作为参数发送到第二页不是更简单吗?
  • 嗨,感谢您已经解决问题的所有帮助。我将值存储到变量中并通过会话传递。

标签: asp.net vb.net visual-studio


【解决方案1】:

好的,这里有一大堆问题。

首先: page.previouspage 仅在您使用时可用

 Server.Transfer("~/MyCoolWebPage.aspx")

并且作为一般规则,您不会以这种方式将“服务器端”传输/跳转/跳转到页面。试图保持这篇文章简短,但是 server.Transfer() 意味着不会发生真正的浏览器端跳转到页面 - 只有服务器端传输。这意味着以前的 URL 甚至不会改变!因此,作为一般规则,页面的跳转是从页面上的按钮单击开始的,该按钮单击可以是客户端 (JavaScript) 单击,也可以是执行 Response.Redirect() 的标准按钮单击。但是,在这两种情况下,它实际上都是客户端浏览器请求。因此,作为一般规则,您不希望构建或编写“假设” Server.Transfer() 是您登陆该页面的方式的网页。

因为以上原因?那么 me.Page.PreviousPage 仅在您登陆的页面是 100% 服务器端重定向到新页面的结果时才可用。事实并非如此,因此对于您的绝大多数网页,page.Previouspage 将为空,并且您使用零。 (它根本不可用)。

所以,现在我们回到将数据“传输”到下一页的传统手段和方法。

请记住,该页面是无状态的。这意味着即使在同一页面上,所有值和变量也会在每次页面加载之间丢失。即使是简单的按钮单击也意味着页面将重新加载,但重新加载会导致您的所有值丢失。现在,当您单击按钮时,大多数控件(例如文本框,甚至网格视图)都可以并且将保持所谓的“往返”状态。

现在,就您而言,毫无疑问,您正在单击一个按钮,然后跳转/加载到一个新网页。因此,之前的所有控件、数据以及您在上一页中存在的所有内容都已消失,并且丢失了。

那么,如何传递值以赋予网页的这种“无状态”性质?

嗯,一种很常见的方法是在 URL 中使用参数。但是,我觉得它们很丑陋,用户也可能会弄乱这些值。但是,对于非常大的网站,我们会看到 URL 中经常使用的参数,这是因为该网站不想花费精力、时间甚至内存和资源来跟踪比如说 100 万用户点击它网站。

但是,在我们所说的往返行程中,还有另一种非常常见的“保存”值的方法。那个方便的花花公子“临时”存储系统称为 Session()。现在 Session() 应该被视为宝贵且有限的资源,但它是您可以(并且应该)传递值的方式。这些价值观的美妙之处在于它们“坚持”并在后背之间保持其价值观。这包括跳转到另一个页面。

那么,要将该数据传递到下一页吗?

只需将该数据行填充到会话中,然后在目标页面中,您就可以从该行数据中获取/抓取/使用/拉取任何值。

所以在你的 response.Redirect("to my 2nd page page") 之前,你可以这样做:

Session("MyTextBox") = me.TextBox1.Text

现在上面的一个文本框值很好。但是,你想传递整行。

所以,你可以去: Session("MyListDataRow") = MyRowOfData

现在,您无需解释选择这一行数据的方式、时间和地点。但是您当然可以将一行数据推入会话中,然后在下一页上显示/显示它。

还有一个 SUPER DUPER Whopper: 如果您确实将选定的行拉出到数据行中(而不是数据表或数据集),请记住 .net 序列化程序不支持数据行(为什么,我不知道!!!)。因此,如果您使用“内存中”会话(),那么您就可以了。但是,如果您决定采用基于 SQL 的 session() 管理,那么该代码将开始失败。因此,要么放入 ListViewDataItem,要么放入数据表以传递该行数据,而不是数据行。

因此,我不会在 Session() 中传递“数据行”,并避免上述 .net 遗漏数据行不支持序列化的可怕启示! (天哪!!!!)。

因此,除非您为此使用 server.transfer(),否则 page.previous 无效也不可用。如果您使用母版页,那么您必须首先挖掘并获取母版页引用,然后是 ContentPlaceHolder,如果您正在使用服务器传输并且因此确实使用了 page.PagePrevious。

编辑: 说了这么多?好吧,如果您在列表视图(或数据网格)行上有一个单击事件,那么 server.transfer 实际上是那些很好的用例中的“一个”,在这些用例中您可以很好地考虑使用 server.transfer(),因为您有通过使用 page.PreviousPage 充分利用第二页中的 listview/datagrid 数据。请注意,如果您使用母版页,则必须再拉下一层才能获得内容。

【讨论】:

  • 嗨,阿尔伯特,感谢您向我解释这一点。它有很大帮助。已经使用会话解决了问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多