【问题标题】:Search button on Master page retrieves info late in the page lifecycle主页上的搜索按钮检索页面生命周期后期的信息
【发布时间】:2013-02-24 18:24:55
【问题描述】:

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

搜索按钮位于母版页上。所有显示控件(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 = Shirts 并点击搜索按钮。

当内容页面加载时,他检查会话中是否有任何东西,有但它是Item = Boots。它执行不必要的数据库/数据绑定调用。然后,触发 BtnSearch 点击事件,我们将新的 Item = Shirts 值加载到会话中,并重新开始生命周期。 这个生命周期很好。

我怎样才能摆脱这种额外的处理?方法不对吗?

我曾考虑在内容页面初始化期间执行 Page.IsPostback() 和 Page.IsCallback() 逻辑,但在实际 Web 应用程序中还有多个其他控件会导致回发和回调。因此,我认为我无法从中获得足够的信息来决定是否跳过。我考虑过包装包含所有 GridViews/tables/labels/etc 的页面的整个部分。在 ajax 回调中,但我认为这不是一个好方法。我考虑过在设置标志的 BtnSearch 单击期间将 ajax 调用发送回服务器。然后在加载期间,我们读取该标志是否跳过,但无法保证该 ajax 调用将在搜索 BtnClick 事件之前处理。

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

【问题讨论】:

    标签: c# asp.net page-lifecycle


    【解决方案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 并使用它来填充搜索框并进行搜索。这样你也有一个 SEO 友好的搜索,用户可以保存他的搜索,你避免了有其他问题的服务器转移。

    【讨论】:

    • 感谢您的意见。我不认为这会起作用,因为视图状态直到 Init() 事件触发后才加载到控件中(它在 PreLoad() 事件之后不久加载)。因此,在我需要初始化控件时,我无法从搜索框中读取它们的新值。
    • @bdizzle 在回发时,控件从 FORM 中获取输入。如果这不起作用,请直接从表格中阅读以完成您的工作
    • 阅读表格的好建议。我可能会使用这种方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2011-05-30
    • 2013-02-20
    相关资源
    最近更新 更多