在我目前的设计方法中,我遇到的情况是我不得不在控件上执行额外的数据库读取和Databind,只是在页面生命周期中稍后覆盖它们。对用户的最终结果是相同的,但在幕后我正在进行两项不必要且昂贵的操作。
搜索按钮位于主页面上。所有显示控件(gridviews / tables / labels / etc)都在内容页面上。数据库调用和数据绑定必须在Page_Init()方法中完成(所使用的大多数控件都必须绑定在这里)。
当用户搜索某个项目时,我会将其搜索输入保存在会话中,以便将其保留为在所有其他内容页面中进行主动查看。因此,当初始化任何内容页面时,我会检查他们是否正在主动查看项目,如果是,则显示他的详细信息。
// Master Page
protected void BtnSearch_OnClick(object sender, EventArgs e)
{
MySession.Current.ItemName = TxtItem.Text.Trim();
Server.Transfer("~/default.aspx");
}
// Content Page
protected void Page_Init(object sender, EventArgs e)
{
// If they're actively viewing an item, display its info
bool HasActiveItem = string.IsNullOrEmpty(MySession.Current.ItemName) ? false : true;
if (HasActiveItem)
{
// Makes one DB call to get all info;
// Binds all that info to GridViews/tables/labels on the page
BindAllDataControls(MySession.Current.ItemName);
// Display
DisplayItemDetails();
}
}
以下是问题:假设用户当前正在查看Item = Boots 。该值保存在会话中。现在,用户搜索Item = Shirts ,然后点击搜索按钮。
当内容页面加载时,他会检查会话中是否有任何内容,但是 Item = Boots 。它执行不必要的数据库/数据绑定调用。然后,触发BtnSearch点击事件,我们将新的 Item = Shirts 值加载到会话中,并开始生命周期。 这个生命周期很好。
如何摆脱额外的处理?方法有误吗?
我考虑过在内容页面初始化期间执行Page.IsPostback()和Page.IsCallback()逻辑,但是有多个其他控件会导致真实Web应用程序中的回发和回调。因此,我认为我不能从中得到足够的信息来决定是否跳过。我已经考虑过包装包含所有GridViews / tables / labels / etc的页面的整个部分。在ajax Callback中,但我认为这不是一个好方法。我已经考虑过在设置标志的BtnSearch点击期间向服务器发送ajax调用。然后在加载期间,我们读取该标志是否跳过,但是没有保证在搜索BtnClick事件之前该ajax调用将处理。
有什么想法吗?或者我应该只是吃这些额外的电话并完成它?还有另一种方式。
答案 0 :(得分:1)
我在这里看到的最简单的解决方案是直接在PageInit上检查搜索文本,而不是在按钮调用上。
// Master Page
protected void BtnSearch_OnClick(object sender, EventArgs e)
{
// remove that lines
// MySession.Current.ItemName = TxtItem.Text.Trim();
// Server.Transfer("~/default.aspx");
}
// Content Page
protected void Page_Init(object sender, EventArgs e)
{
// direct add here your variable on session
var vSearchText = TxtItem.Text.Trim();
if(!string.IsNullOrEmpty(vSearchText))
MySession.Current.ItemName = vSearchText ;
// ------------ rest of your code ---------------
// If they're actively viewing an item, display its info
bool HasActiveItem = string.IsNullOrEmpty(MySession.Current.ItemName) ? false : true;
if (HasActiveItem)
{
// Makes one DB call to get all info;
// Binds all that info to GridViews/tables/labels on the page
BindAllDataControls(MySession.Current.ItemName);
// Display
DisplayItemDetails();
}
}
现在告诉你实话,Server.Transfer并不是一个好主意,我所做的是我在URL中使用参数,包含来自用户输入的搜索字符串,所以当用户添加一些东西时搜索我创建的URL为:
http://www.mydomain.com?q=test
然后我阅读q
并使用它来填充搜索框并进行搜索。通过这种方式,您还可以进行搜索引擎优化搜索,用户可以保存搜索结果,避免服务器传输出现其他问题。