【问题标题】:Asp.NET MasterPage session variable NULL on PostBackPostBack 上的 Asp.NET MasterPage 会话变量 NULL
【发布时间】:2014-08-19 13:07:50
【问题描述】:

我已经搜索了多个与此类似的问题,但未能提出解决方案。在我的 Masterpage 中,我有一个位于页面标题中的搜索文本框。单击搜索按钮时,我在 on_click 事件中设置了会话变量 = textbox2.text。然后我有一个单独的页面“Page.aspx”,它继承了该 MasterPage。当我在 Page.aspx 上尝试搜索某些内容时,问题就出现了,因为 onPostBack 没有看到文本框中的文本。我试图弄清楚如何在回发=真时设置会话(“搜索”)= Textbox2.text。这是我的 MasterPage 中的代码...

Protected Sub ImageButton2_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs) Handles ImageButton2.Click
    ViewState("Search") = TextBox2.Text
    Session("Search") = TextBox2.Text

    Dim Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Sprayer_Parts_CatalogConnectionString").ConnectionString.ToString)
    Dim sql As New SqlDataSource
    Dim sql3 As New SqlCommand
    Dim sql4 As New SqlCommand
    Dim str2 As String
    Dim str As String
    sql4.Connection = Conn
    sql3.Connection = Conn
    Conn.Open()

    sql3.Parameters.AddWithValue("@Search", TextBox2.Text)
    sql4.Parameters.AddWithValue("@Search", TextBox2.Text)
    sql3.CommandText = "Select Category From SubCategory WHERE Category Like '%' + @Search + '%'"
    sql4.CommandText = "Select Type From SubCategory WHERE Type LIKE '%' + @Search + '%' OR Category LIKE '%' + @Search + '%'"

    str = sql4.ExecuteScalar().ToString
    'Response.Redirect("~/Parts_Catalog.aspx?")
    Conn.Close()

End Sub

这是我的“Page.aspx.vb”中的代码

 Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load

    Dim url1 As String = Request.QueryString("Category")
    Dim url As String = Request.QueryString("Item")
    Dim Conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Sprayer_Parts_CatalogConnectionString").ConnectionString.ToString)
    Dim sql As New SqlDataSource
    Dim sql3 As New SqlCommand
    sql3.Connection = Conn
    Dim UrlStr As String
    Dim Search As String = CType(Session.Item("Search"), String)

    If Not Search = "" Then
        FormView1.DataSourceID = "SqlDataSource4"

        Dim LV As ListView = FormView1.FindControl("ListView1")
        LV.DataSourceID = "SqlDataSource4"
        LV.DataBind()

    End If

    If url1 = "Spray Guns" Then

        Response.Redirect("~/Product.aspx?Product=" + url1)

    End If
    If IsPostBack Then

        If Search = "" Then
            Conn.Open()
            sql.SelectParameters.Add("@Item", url)
            sql3.Parameters.AddWithValue("@Item", url)
            sql3.CommandText = "Select Type From SubCategory Where Category = @Item"
            sql.SelectCommand = sql3.CommandText
            UrlStr = sql3.ExecuteScalar.ToString

            If UrlStr = "" Then
                Response.Redirect("~/Product.aspx?Product=" + url)
            End If

            Conn.Close()
            Response.Write("Param is :" + url1)
        End If
    End If


End Sub

【问题讨论】:

  • 不清楚流是什么。 ImageButton2_Click 是否应该重定向到 Page.aspx,将 Category 和 Type 作为 queryString 值传递?
  • 这基本上就是正在发生的事情。因为一旦我传递了会话值,我就会在我的一个 SqlDataSources 中查询该字符串值。不过现在,我只需要知道如何在 Page.aspx 上的 IsPostBack 为 true 时获取文本框的值。我已经测试过将它实际传递到查询中并且它可以工作,只是当我无法在 IsPostBack 上获取 Session("search") 的值时就不行了
  • 所以,当我第一次加载 Page.aspx 页面时,该页面的页眉中有一个文本框。 Header 和文本框实际上是在 MasterPageFile 上编码的。因此,当在该文本框中键入文本并单击搜索按钮时,我试图在母版页文件中分配 Session("search") = Textbox2.text,因为我无法从 Page.aspx 访问文本框。然后我试图读取 Page.aspx 上的 Session("search") 以获取值。这有意义吗?
  • 如果 page.aspx 正在显示并且用户输入搜索值并单击按钮,则不会设置“搜索”的会话值,因为页面的 Page_load 事件在按钮的 Click 事件之前触发。如果值发生更改并且再次单击按钮,则应显示先前的值,因为该值仍将在会话中。
  • 会话不是在页面之间传递值的正确方式。这会导致错误,因为该值保留在 Session 中,直到显式删除。当用户在页面中来回移动时,您将因为残留数据而触发逻辑。

标签: asp.net vb.net null postback session-variables


【解决方案1】:

您的问题的直接答案是将 Page.aspx Page_Load 事件中的逻辑移动到 LoadComplete 事件中。单击按钮后会触发 Load Complete 事件,以便设置会话变量。

更好的方法是停止使用会话来传递搜索值。

一种方法是:

  • 将 Page.aspx 中的 Page_Load 逻辑移动到 Load Complete 事件中。
  • 从 Master1 中,将搜索参数作为查询字符串值而不是会话传递。请务必对其进行编码,因为它可能包含任何字符。 Instructions
  • 将 Master2 的搜索逻辑更改为与 Master1 相同。这可以重构为通用方法。结果是即使您已经在 Page.aspx 上,您也会重定向到 Page.aspx。
  • 确保在按钮单击事件中进行重定向时结束响应。 Me.Response.Redirect(theurl, True)

【讨论】:

  • 我相信我已经修复了它,至少是临时修复。我按照您的建议将代码放在加载完成页面事件中,现在我将文本框值作为查询字符串传递。您是否建议在另一个母版页上也为此做同样的事情?
  • 是的,使它们都相同会使维护更容易
  • 好的,非常感谢您的帮助。我相信这个修复应该很好用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2017-03-04
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多