【问题标题】:Get child page data from master page selectedItems从母版页 selectedItems 获取子页数据
【发布时间】:2016-06-20 15:47:12
【问题描述】:

我的母版页中有位置 DropdownList。我在我的子页面中设置了控件,该控件从母版页获取属性。现在我正在运行一个查询

SELECT * FROM table where city like '"+city.text+"'

这里 city.text 从母版页选定的城市中获取价值。但我的问题是它实际上并没有按照 city.text 显示记录,其中包含值。它显示任何随机记录。

我的代码

母版页

<asp:DropDownList ID="locationSelector" runat="server" AutoPostBack="true">
                        <asp:ListItem Selected>Pune</asp:ListItem>
                        <asp:ListItem>Delhi</asp:ListItem>
                        <asp:ListItem>Chennai</asp:ListItem>
                        <asp:ListItem>Bangalore</asp:ListItem>
                        <asp:ListItem>Mumbai</asp:ListItem>
                    </asp:DropDownList>

子页面VB代码

Dim location As DropDownList = Page.Master.FindControl("locationSelector")
        city.Text = location.SelectedItem.ToString

        If Not IsPostBack Then
            Try
                query = "SELECT * FROM hospitals where city like '" + city.Text + "'"
                Dim cmd As New MySqlCommand(query, con)
                cmd.CommandTimeout = 120
                Dim da As New MySqlDataAdapter(cmd)
                Dim table As New DataTable
                da.Fill(table)
                ViewState("Data") = table
                hospitals.DataSource = table
                hospitals.DataBind()

            Catch ex As Exception
                Response.Write(ex)
            End Try
        End If

更新

Protected Sub hospitals_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Dim location As DropDownList = Page.Master.FindControl("locationSelector")
        city.Text = location.SelectedItem.ToString
    End Sub

有时它也会抛出 TimeOut 错误。但大多数时候它会得到结果,但不是按照选定的项目。对此还有什么其他解决方案?

【问题讨论】:

  • 什么类型的控制是“医院”???

标签: asp.net vb.net master-pages


【解决方案1】:

几个小贴士:

1) 发生超时错误的原因有很多,包括站点的大量其他流量、连接池全部用完等。对于一小部分城市,我可能会在第一次之后将其保存在缓存中调用,这样您就不需要每次都从数据库中加载城市列表。根据您所在的国家/地区,如果您只有几千个城市,那么只需将其放入内存列表中即可。

2) 您正在使用“SELECT *”,这对于其他开发人员来说通常并不酷,如果表中包含的不仅仅是城市名称,对您的代码也不是很酷。如果您编写 Select CityName from Table,那么您将有效地减少从数据库传输到程序的数据量,并且其他开发人员可以清楚地知道您从该表中提取了什么.

3) 如果你有一个城市的 ID,它的性能可能会更好,因为与匹配几个 ID 相比,字符串匹配真的很慢。通过用常量替换字符串,我看到了 20% 的速度提升,你不会相信这些天字符串在代码中的速度有多慢。

4) 最后,我认为您可能已经这样做了,请确保您对执行 WHERE 过滤器的每个字段进行索引。如果您搜索 Hospitals,请确保 Hospitals.City 字段已编入索引以避免行查找。

我希望(任何)这对你有帮助:)

【讨论】:

  • 你的意思是我应该创建城市 cookie。一旦第一次选择城市,然后从 cookie 中获取城市价值?
  • 没有。把它想象成你的代码中的一个单例——第一次加载城市时,你首先检查“我有我的城市对象吗!= null?)然后用数据库中的城市在服务器端填充它。附加然后请求可以执行相同的检查并从您的内存中交付城市:)
  • 我建议在页面中使用预渲染事件。在预渲染事件中尝试访问您的母版页控件并获取值。
  • @PiyushKhatri 在 Pre_Render 事件上我尝试了这个,但它不起作用。如您所说,请参阅我添加的更新代码。请检查
  • 你在预渲染事件中获得城市价值吗?
【解决方案2】:

据我了解,您需要在下面进行更改

要获取选定的 TEXT 值,请使用 location.SelectedItem.Text 而不是 location.SelectedItem.ToString()

     city.Text = location.SelectedItem.Text // change here

在绑定下拉控件之前检查否。行数

if(table.Rows.Count>0)
            {
                hospitals.DataSource = table;
                hospitals.DataBind();
            }

【讨论】:

    【解决方案3】:

    我建议在页面中使用预渲染事件。在预渲染事件中尝试访问您的母版页控件并获取值。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多