1

在我目前的设计方法中,我遇到了一种情况,我必须在控件上执行额外的数据库读取和数据绑定,只是为了在页面生命周期的后期覆盖它们。对用户的最终结果是相同的,但在幕后我做了两个不必要且成本高昂的操作。

搜索按钮位于母版页上。所有显示控件(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 事件之前处理。

有任何想法吗?还是我应该只吃这些额外的电话并完成它?一定有别的办法。

4

1 回答 1

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 中使用参数,以包含来自用户输入的搜索字符串,所以当用户添加一些内容进行搜索时,我创建网址为:

http://www.mydomain.com?q=test

然后我阅读q并使用它来填充搜索框并进行搜索。这样你也有一个 SEO 友好的搜索,用户可以保存他的搜索,你避免了有其他问题的服务器转移。

于 2013-02-24T20:24:00.420 回答