ОК, постбэки между страницами в 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" />
Теперь, как обрабатывать постбэк в коде. В событии Page_Load
для searchresults.aspx мы проверяем свойство PreviousPage
. PreviousPage
может быть Nothing
(если, скажем, пользователь набрал непосредственно в searchresults.aspx), так что если это так, мы перенаправим обратно на search.aspx. Если PreviousPage
равно что-то , то мы можем проверить свойство IsCrossPagePostback
. Если это правда, то мы, вероятно, попали сюда со страницы search.aspx (это может быть не полностью допустимое предположение, но на данный момент этого достаточно). Если это так, то мы можем привести PreviousPage к базовому классу search.aspx, и, поскольку мы сделали общедоступными элементы управления dropdownlist и textbox, мы можем получить к ним доступ в качестве свойств в нашем коде.
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
Что касается вашего требования, что результаты поиска должны показывать только одну строку, подумайте, возможно ли иметь двух сотрудников с одинаковым именем в одном отделе в одном месте. Это может быть маловероятно, но я не думаю, что это невозможно, и я не уверен, что у вас должно быть ограничение, что вы не должны показывать это. Если бы это была, скажем, система начисления заработной платы, у вас могла бы получиться запись, которую вы никогда бы не смогли получить через пользовательский интерфейс, поэтому вы бы никогда не смогли перестать платить этому конкретному сотруднику - возможно, не так, как вы хочет!