【问题标题】:How to tell if JavaScript caused my update panel to update?如何判断 JavaScript 是否导致我的更新面板更新?
【发布时间】:2012-12-02 23:39:46
【问题描述】:

我使用以下 javascript 代码在页面加载后调用更新面板的更新:

<script type="text/javascript">
        function pageLoad(objSender, args) {
            Sys.WebForms.PageRequestManager.getInstance()._doPostBack('updtPnlAccessoriesPanel', 'updtPnlAccessoriesPanel');
        }
</script>

我不希望更新面板(其中包含用户控件)在页面加载并显示之前触发。这将允许它异步更新更新面板(及其用户控件)。

因此,在用户控件的 page_load 中,我想告诉它在初始页面加载期间忽略任何内容,并且仅在页面已经为用户加载后由 javascript 调用时才执行其工作。在此用户控件中完成的工作需要额外的几秒钟,我不希望它减慢初始页面的加载速度。

有什么想法吗?

谢谢! :)

【问题讨论】:

    标签: javascript asp.net updatepanel


    【解决方案1】:

    解决方案很简单 - 只需在页面加载后使用 IsPostBack 进行工作,因为当您使用 javascript 触发 UpdatePanel 时,您会将帖子发送回服务器。就这样吧:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            // now do your work
        }
    }
    

    为了使其更高级,您甚至可以简单地检查 PostBack 是否来自该面板。我使用了一个检查女巫 UpdatePanel 的函数是否触发了事件,所以我们的代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack && IsUpdatePanelInRendering(Page, upUpdatePanelId))
        {
            // run the code for update panel 1, me
            // ...
        }
    }
    

    IsUpdatePanelInRendering 的位置:

    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;
        }
    }
    

    【讨论】:

    • 我仍然无法让它正常运行,Aristos。我希望整个页面被渲染和可见,包括一些用户控件等。然后,我希望一个特定的更新面板(其中只有一个用户控件)在页面的其他部分之后加载并完成所有工作在那里。此外,在我的例子中,主页做了一些工作,并在会话变量中保存了一些数据。然后我希望延迟更新面板/用户控件使用它来做更多的工作。
    • 如何告诉我的用户控件在页面第一次加载时不要触发,而是稍后通过 javascript updatepanel 调用异步执行其工作?
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2012-06-11
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2019-10-04
    相关资源
    最近更新 更多