好的,ASP.NET 中的跨页回发。我们开始吧。
从您的搜索页面开始,我们将其称为 search.aspx - 这包含您的下拉列表、文本框和按钮。
Employee Name: <asp:TextBox runat="server" ID="SearchTextBox" />
<br />
<asp:DropDownList runat="server" ID="LocationDropDownList">
<asp:ListItem Text="Springfield" Value="Springfield" />
<asp:ListItem Text="Shelbyville" Value="Shelbyville" />
</asp:DropDownList>
<br />
<asp:DropDownList runat="server" ID="DepartmentDropDownList">
<asp:ListItem Text="Nuclear Power" Value="Power" />
<asp:ListItem Text="Dr. Frink's Lab" Value="Research" />
<asp:ListItem Text="Mr. Burn's Office" Value="Management" />
</asp:DropDownList>
<br />
<asp:Button runat="server" ID="SearchButton" Text="Search" PostBackUrl="~/SearchResults.aspx" />
请注意,该按钮具有 PostBackUrl 属性 - 这是将请求发布到结果页面的原因。我们还需要更改 search.aspx.designer.vb,使下拉列表和文本框成为公共属性,不受保护。
Public WithEvents SearchTextBox As Global.System.Web.UI.WebControls.TextBox
结果页面,即 searchresults.aspx,上面有 GridView。
<asp:gridview runat="server" id="SearchResultsGridView" />
现在,如何处理代码中的跨页回发。在 searchresults.aspx 的 Page_Load 事件中,我们检查 PreviousPage 属性。 PreviousPage 可能是Nothing(例如,如果用户直接输入了 searchresults.aspx),所以如果是,我们将重定向回 search.aspx。如果PreviousPage 是something,那么我们可以检查IsCrossPagePostback 属性。如果这是真的,那么我们可能是从我们的 search.aspx 页面到这里的(这可能不是一个完全有效的假设,但它现在已经足够好了)。如果是这种情况,那么我们可以将 PreviousPage 强制转换为 search.aspx 的底层类,并且由于我们将下拉列表和文本框控件公开,因此我们可以在此处的代码中将它们作为属性进行访问。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim employeeName As String
Dim department As String
Dim location As String
Dim searchPage As Search
If PreviousPage Is Nothing Then
Response.Redirect("search.aspx")
Else
If PreviousPage.IsCrossPagePostBack Then
searchPage = DirectCast(PreviousPage, Search)
employeeName = searchPage.SearchTextBox.Text
department = searchPage.DepartmentDropDownList.SelectedValue
location = searchPage.LocationDropDownList.SelectedValue
Call bindData(employeeName, department, location)
End If
End If
End Sub
Private Sub bindData(ByVal employeeName As String, ByVal locationName As String, ByVal departmentName As String)
With searchResultsGridView
.DataSource = 'Some code that passes the search parameters to the database
.DataBind()
End With
End Sub
关于搜索结果只显示一行的要求,请考虑是否可以在同一部门、同一地点有两个同名员工。这可能不太可能,但我认为这不是不可能的,我不确定你是否应该有一个不应该显示的限制。如果这是,比如说,一个工资系统,你最终可能会得到一个你永远无法通过 UI 获得的记录,所以你永远无法停止支付那个特定的员工 - 可能不是你想要的想要!