如何防止用户控制代码在异步回发中运行?

时间:2011-07-21 17:27:33

标签: .net asp.net ajax user-controls updatepanel

我有一个包含几十个自定义控件的aspx页面问题是我有一个asp.net Ajax更新面板,它更新页面的其他用户控制页面的小区域。(用户控件在更新面板之外,更新面板有UpdateMode =“条件”)是否有一种方法可以编程方式防止自定义控件后面的代码运行,因为这会严重降低性能/页面加载时间。我检查了脚本管理器的IsAsyncPostback,以防止对DAL进行不必要的调用。有没有办法防止根据以下条件运行自定义控制代码,

  • 无法触摸后面的自定义控件代码,ascx页面文件等
  • 无法使用缓存
  • 可以对我上面提到的aspx页面及其代码进行任何更改。
  • 无法集成Jquery或javascript框架(希望我能)现在为时已晚。

3 个答案:

答案 0 :(得分:0)

稍微偏离主题,但您是否有自由探索不包括使用UpdatePanel的方法?众所周知,他们表现不佳,应该谨慎使用。

话虽如此,UserControl的页面生命周期方法必须触发才能再次呈现它们。 UpdatePanel方法不是您对“AJAX”解决方案的期望,因为从技术上讲,当UpdatePanel更新整个页面时会重新呈现,但只返回您要求更改的部分并在UI中重新绘制。

您可以做的是通过以下方式检查您是否处于AJAX回发中:

ScriptManager.IsInAsyncPostBack

然后,如果该属性的计算结果为true,则可以阻止代码在UserControl的方法中运行。

答案 1 :(得分:0)

您可以使用Page.LoadControl有条件地加载它们。在实践中,这是一个巨大的痛苦,并为已经很复杂的架构增加了很多复杂性。

除此之外,您正在查看页面事件代码中的条件检查。由于您已经使用IsInAsyncPostback来阻止数据访问,为什么不在相同条件下跳过所有代码执行?

答案 2 :(得分:0)

这是我用来消除更新面板内的许多自定义控件上未使用的渲染的代码

<asp:UpdatePanel ID="updPnlUserAct" runat="server" RenderMode="Block" UpdateMode="Conditional" >
<ContentTemplate>   

背后的代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsUpdatePanelInRendering(Page, updPnlUserAct))
        return ;

这是进行检查的代码

public static bool IsUpdatePanelInRendering(Page page, UpdatePanel panel)
{
    Debug.Assert(HttpContext.Current != null, "Where are you called ? HttpContext.Current is null ");
    Debug.Assert(HttpContext.Current.Request != null, "Where are you called HttpContext.Current.Request is null ");

    // if not post back, let it render
    if (false == page.IsPostBack)
    { 
        return true; 
    }
    else
    {
        try
        {
            // or else check if need to be update
            ScriptManager sm = ScriptManager.GetCurrent(page);

            if (sm != null  && sm.IsInAsyncPostBack)
            {
                Debug.Assert(HttpContext.Current.Request.Form != null, "Why forms are null ?");

                string smFormValue = HttpContext.Current.Request.Form[sm.UniqueID];

                if (!string.IsNullOrEmpty(smFormValue))
                {
                    string[] uIDs = smFormValue.Split("|".ToCharArray());
                    if (uIDs.Length == 2)
                    {
                        if (!uIDs[0].Equals(panel.UniqueID, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return false;
                        }
                    }
                }
            }
        }
        catch (Exception x)
        {
            Debug.Fail("Ops, what we lost here ?");
        }

        return true;
    }
}