“母版页”上的“搜索”按钮可在页面生命周期的后期检索信息

时间:2013-02-24 18:24:56

标签: c# asp.net page-lifecycle

在我目前的设计方法中,我遇到的情况是我不得不在控件上执行额外的数据库读取和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调用将处理。

有什么想法吗?或者我应该只是吃这些额外的电话并完成它?还有另一种方式。

1 个答案:

答案 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并使用它来填充搜索框并进行搜索。通过这种方式,您还可以进行搜索引擎优化搜索,用户可以保存搜索结果,避免服务器传输出现其他问题。