我在页面上有两个控件,一个是搜索条目和提交控件,另一个是搜索结果控件,由于站点的布局,它们必须分开。我正在寻找让搜索控件提交在结果控件中显示搜索结果的不同方式,最初我不关心回发,我更加困扰两件事
1)如何将选定的搜索词传递回同一页面(或实际上传递给显示结果的控件)QUerystring,hiddenfield,session,viewstate(有效隐藏字段)?
2)我如何实际让页面提交给自己。
如果这有点基本但我不是ASP.Net专家,请道歉答案 0 :(得分:2)
有许多方法可以做你要求的事情,说实话我不确定是否有正确的答案。这一切都取决于您的开发风格和您试图解决的问题。
我在编写搜索界面方面有相当多的经验,在我看来,使用查询字符串是传递搜索条件的好方法。然而,这有其优点和缺点。
优点:
您只需传递查询字符串,即可从您网站的任何位置或外部网站访问搜索结果页。
您的搜索结果可以轻松抓取,因为它们只是您网站上的网页。
查询字符串使用起来非常简单。
用户可以在查询字符串中查看他们正在搜索的内容。 (但根据其使用情况,这可能是一件坏事。)
用户可以预订标记他们的搜索结果(感谢FredrikMörk)
缺点:
您可能需要花时间让搜索条件看起来很漂亮。 I.E.您是否希望您的用户只是看到一个对他们毫无意义的ID?
您可能会遇到html编码搜索条件的问题,因为它们需要作为查询字符串参数传递。编码可以轻松完成,但如果您使用保留字符进行其他操作,可能会让您头疼。
您的用户可以看到他们正在搜索的内容。 (就像我说这可能是好事还是坏事。)
您的查询字符串可能会变得太长。
我可能还有其他一些我没有想过的事情,但这会给你一个想法。
至于将页面再次发回给自己,有几种方法可以做到这一点,但尝试使用#符号作为href属性的提交按钮或锚标记。
要考虑的另一件事可能是使用url重写器使你丑陋的查询字符串看起来很漂亮。
例如:
used_car_search.aspx使=福特&安培;模型=焦点
可能成为:
used_ford_focus.html
快乐编码:)
答案 1 :(得分:2)
这些是UserControls,对吗?我认为在UserControls之间进行通信的最佳方式是使用事件。创建自己的EventArgs类以封装搜索条件。提交控件在提交搜索时引发事件,并且包含页面处理事件并在搜索结果控件上调用方法以执行搜索和显示结果。
或者,结果控件可能只负责显示对象集合,搜索控件实际上会执行搜索并在EventArgs中返回集合。
以下是UserControls的主 - 详细信息集的示例。 ProjectList UserControl在选择项目时引发事件:
public event EventHandler<ProjectSelectedEventArgs> ProjectSelected;
protected void uxProjectList_OnSelectedIndexChanged(object sender, EventArgs e)
{
if (ProjectSelected != null)
{
var keys = uxProjectList.DataKeys[uxProjectList.SelectedIndex].Values;
var projectId = (Guid)keys[0];
var args = new ProjectSelectedEventArgs(projectId);
ProjectSelected(this, args);
}
}
容器页面处理事件并调用ProjectDetail UserControl上的方法以显示项目的详细信息。
protected void uxHeroProjectList_ProjectSelected(object sender, ProjectSelectedEventArgs e)
{
uxProjectDetails.Visible = true;
uxProjectDetails.DisplayDetails(e.ProjectId);
}