在我目前的设计方法中,我遇到了一种情况,我必须在控件上执行额外的数据库读取和数据绑定,只是为了在页面生命周期的后期覆盖它们。对用户的最终结果是相同的,但在幕后我做了两个不必要且成本高昂的操作。
搜索按钮位于母版页上。所有显示控件(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 回调中,但我认为这不是一个好方法。我考虑过在设置标志的 BtnSearch 单击期间将 ajax 调用发送回服务器。然后在加载期间,我们读取该标志是否跳过,但无法保证该 ajax 调用将在搜索 BtnClick 事件之前处理。
有任何想法吗?还是我应该只吃这些额外的电话并完成它?一定有别的办法。