我目前正在使用UpdatePanel和updatemode条件构建搜索功能。此updatepanel的触发器是我的searchPhrase TextBox。当TextChanged触发时,我的面板会更新并显示正确的搜索结果。 然而,我对如何实现可与我的搜索结果一起使用的分页功能毫无头绪。 我希望分页链接显示在部分页面更新上,我希望寻呼机也更新我的searchResults(只想在一个页面上显示3个结果)。 如何正确设置?
这是我的代码(ascx)
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
</asp:ScriptManagerProxy>
<div class="searchBox">
<asp:TextBox ID="searchPhrase" runat="server"
AutoCompleteType="Search"
AutoPostBack="true" />
</div>
<asp:UpdatePanel ID="ProductenUpdate" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Repeater ID="ProductRepeater" runat="server">
<ItemTemplate>
<strong><sc:Text ID="Titel" Field="Titel"
runat="server" /></strong><br />
<sc:Text ID="Auteur" Field="Auteur" runat="server" />
<sc:Text ID="Intro" Field="Intro" runat="server" />
<sc:Image ID="Thumb" Field="Thumbnail" runat="server" /><br/>
</ItemTemplate>
</asp:Repeater>
<div class="filterBox">
<asp:PlaceHolder ID="filterOnePlaceholder"
runat="server">
<sc:Text ID="TitelOne" Field="Filter1" runat="server" />
<asp:CheckBoxList ID="filterOneCbl" runat="server"
AutoPostBack="true"
CssClass="checkboxList">
</asp:CheckBoxList>
</asp:PlaceHolder>
</div>
<div class="filterBox">
<asp:PlaceHolder ID="filterTwoPlaceholder"
runat="server">
<sc:Text ID="TitelTwo" Field="Filter2" runat="server" />
<asp:CheckBoxList ID="filterTwoCbl" runat="server"
AutoPostBack="true"
CssClass="checkboxList"
RepeatColumns="3"
RepeatDirection="Vertical">
</asp:CheckBoxList>
</asp:PlaceHolder>
</div>
<div>
PaginaMarker DIV:
<asp:Label ID="paginaMarker" runat="server" />
</div>
<script type="text/javascript">
function ClientCallbackFunction(args)
{
}
</script>
<asp:Button ID="btnBackwards" Text="Vorige"
OnClick="MyServerCall(this.value)" />
<asp:Button ID="btnForward" Text="Volgende"
OnClick="MyServerCall(this.value)" />
<asp:DropDownList ID="DropDownListChoice" runat="server"
onChange="MyServerCall(this.value)">
<asp:ListItem>Choice 1</asp:ListItem>
<asp:ListItem>Choice 2</asp:ListItem>
<asp:ListItem>Choice 3</asp:ListItem>
<asp:ListItem>Choice 4</asp:ListItem>
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="searchPhrase"
EventName="TextChanged" />
</Triggers> </asp:UpdatePanel>
代码背后的代码:
// Needed to store the searchResults
List<Item> validSearchResults = new List<Item>();
private List<string> listOneSelectedItems = new List<string>();
private List<string> listTwoSelectedItems = new List<string>();
private string currentCategoryPath = string.Empty;
private string _callbackArgs;
/// <summary>
/// Raises the <see cref="E:System.Web.UI.Control.Init"/> event.
/// </summary>
/// <param name="e">An <see cref="T:System.EventArgs"/> object that contains the event data.</param>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.UpdateSelectedItemLists();
this.currentCategoryPath = Sitecore.Context.Item.Paths.FullPath;
this.searchPhrase.TextChanged += new EventHandler(searchPhrase_TextChanged);
this.filterOneCbl.SelectedIndexChanged += new EventHandler(filterOneCbl_SelectedIndexChanged);
this.filterTwoCbl.SelectedIndexChanged += new EventHandler(filterTwoCbl_SelectedIndexChanged);
this.ProductRepeater.ItemDataBound += new RepeaterItemEventHandler(ProductRepeater_ItemDataBound);
}
private void UpdateScreen()
{
// update the list of selectedItems for use with the selection of new Items from the index
this.UpdateSelectedItemLists();
this.GetSearchResults();
ProductRepeater.DataSource = validSearchResults;
ProductRepeater.DataBind();
ProductenUpdate.Update();
}
void btnSearch_Click(object sender, EventArgs e)
{
// update the list of selectedItems for use with the selection of new Items from the index
this.UpdateSelectedItemLists();
this.GetSearchResults();
ProductRepeater.DataSource = validSearchResults;
ProductRepeater.DataBind();
ProductenUpdate.Update();
}
private void ProductRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Item dataItem = (Item)e.Item.DataItem;
// if there is a dataItem
if (dataItem != null)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.Item)
{
Sitecore.Web.UI.WebControls.Text Titel = (Sitecore.Web.UI.WebControls.Text)e.Item.FindControl("Titel");
Sitecore.Web.UI.WebControls.Text Auteur = (Sitecore.Web.UI.WebControls.Text)e.Item.FindControl("Auteur");
Sitecore.Web.UI.WebControls.Text Intro = (Sitecore.Web.UI.WebControls.Text)e.Item.FindControl("Intro");
Sitecore.Web.UI.WebControls.Image Thumb = (Sitecore.Web.UI.WebControls.Image)e.Item.FindControl("Thumb");
if (Thumb != null)
{
Thumb.Item = dataItem;
}
if (Titel != null)
{
Titel.Item = dataItem;
}
if (Auteur != null)
{
Auteur.Item = dataItem;
}
if (Intro != null)
{
Intro.Item = dataItem;
}
}
}
}
/// <summary>
/// Handles the TextChanged event of the searchPhrase control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void searchPhrase_TextChanged(object sender, EventArgs e)
{
this.UpdateScreen();
}
/// <summary>
/// Handles the SelectedIndexChanged event of the filterTwoCbl control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void filterTwoCbl_SelectedIndexChanged(object sender, EventArgs e)
{
this.UpdateScreen();
}
/// <summary>
/// Handles the SelectedIndexChanged event of the filterOneCbl control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
private void filterOneCbl_SelectedIndexChanged(object sender, EventArgs e)
{
this.UpdateScreen();
}
/// <summary>
/// Updates the selected item lists.
/// </summary>
private void UpdateSelectedItemLists()
{
foreach (ListItem thisItem in filterOneCbl.Items)
{
if (thisItem.Selected)
{
if (!listOneSelectedItems.Contains(thisItem.Value.ToUpper()))
{
listOneSelectedItems.Add(thisItem.Value.ToUpper());
}
}
}
foreach (ListItem thisItem in filterTwoCbl.Items)
{
if (thisItem.Selected)
{
if (!listTwoSelectedItems.Contains(thisItem.Value.ToUpper()))
{
listTwoSelectedItems.Add(thisItem.Value.ToUpper());
}
}
}
}
/// <summary>
/// Gets the search results.
/// </summary>
private void GetSearchResults()
{
SearchResultRetreiver retriever = new SearchResultRetreiver("productenSearch");
IndexSearcher searcher = null;
Hits mySearchResults = retriever.GetSearchResults(searchPhrase.Text.Trim(), ref searcher);
if (mySearchResults != null)
{
for (int i = 0; i < mySearchResults.Length(); i++)
{
Item newItem = Sitecore.Data.Indexing.Index.GetItem(mySearchResults.Doc(i), Sitecore.Context.Database);
string itemTitel = SitecoreHelper.ShowItemTitel(newItem);
bool addItem = true;
if (itemTitel.StartsWith("$")) addItem = false;
if (itemTitel.StartsWith("_")) addItem = false;
if (addItem)
{
this.validSearchResults.Add(newItem);
}
}
}
}
private void FilterSearchResults()
{
}
/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Page_Load(object sender, EventArgs e)
{
Item contextItem = Sitecore.Context.Item;
Item subwebsiteItem = contextItem.Axes.GetAncestors().Where(c => c.Axes.Level == 4).FirstOrDefault<Item>();
Sitecore.Data.Fields.CheckboxField filterOneSelected = subwebsiteItem.Fields["Filter1Actief"];
Sitecore.Data.Fields.CheckboxField filterTwoSelected = subwebsiteItem.Fields["Filter2Actief"];
if (filterOneSelected.Checked)
{
TitelTwo.Item = subwebsiteItem;
}
if (filterTwoSelected.Checked)
{
TitelOne.Item = subwebsiteItem;
}
if (!Page.IsPostBack)
{
string callbackRef = Page.ClientScript.GetCallbackEventReference(this, "args", "ClientCallbackFunction", "");
string callbackScript = "function MyServerCall(args)" +
"{" + callbackRef + "}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "MyServerCall", callbackScript, true);
filterOnePlaceholder.Visible = false;
filterTwoPlaceholder.Visible = false;
if (subwebsiteItem != null)
{
if (filterOneSelected.Checked)
{
filterOnePlaceholder.Visible = true;
Item filterOneLocation = Sitecore.Context.Database.GetItem(subwebsiteItem.Paths.FullPath + "/Filters/Filter1");
List<Item> filterOneList = new List<Item>();
filterOneList = filterOneLocation.GetChildren().Where(c => c.TemplateName.ToLower() == "filter").ToList<Item>();
foreach (Item filterItem in filterOneList)
{
ListItem thisItem = new ListItem(filterItem["Naam"], filterItem.ID.ToGuid().ToString());
this.filterOneCbl.Items.Add(thisItem);
}
}
if (filterTwoSelected.Checked)
{
filterTwoPlaceholder.Visible = true;
Item filterTwoLocation = Sitecore.Context.Database.GetItem(subwebsiteItem.Paths.FullPath + "/Filters/Filter2");
List<Item> filterTwoList = new List<Item>();
filterTwoList = filterTwoLocation.GetChildren().Where(c => c.TemplateName.ToLower() == "filter").ToList<Item>();
foreach (Item filterItem in filterTwoList)
{
ListItem thisItem = new ListItem(filterItem["Naam"], filterItem.ID.ToGuid().ToString());
this.filterTwoCbl.Items.Add(thisItem);
}
}
}
}
}
#region ICallbackEventHandler Members
/// <summary>
/// Returns the results of a callback event that targets a control.
/// </summary>
/// <returns>The result of the callback.</returns>
public string GetCallbackResult()
{
return this._callbackArgs;
}
/// <summary>
/// Processes a callback event that targets a control.
/// </summary>
/// <param name="eventArgument">A string that represents an event argument to pass to the event handler.</param>
public void RaiseCallbackEvent(string eventArgument)
{
this._callbackArgs = eventArgument;
}
请看一下,告诉我如何让寻呼机为我的解决方案工作。
答案 0 :(得分:0)
我通过引入一个GetList()方法和一个在彼此之后调用的Update()方法来解决这个问题。在de GetList()方法中,我设置了项目的总量,然后在Update方法中,我将调用另一个创建寻呼机的方法。 这解决了我的问题。