防止来自__doPostBack的完整回发

时间:2011-07-29 14:12:20

标签: c# jquery asp.net dopostback

我的内容页面包含以下内容...

  
      
  1. UpdatePanel1 - 包含错误显示分区
        包含两个按钮的更新触发器
  2.   
  3. UpdatePanel2 - 包含带有asp:按钮的进程1
  4.   
  5. updatePanel3 - 包含带有asp:按钮的进程2
  6.   
  7. 向用户显示弹出窗口的JavaScript根据正在执行的进程确认Jquery Messagebox。
  8.   

根据菜单选项中的用户选择,UpdatePanel 2或3变为可见。

selecting menu item 2 will display this page shown with an error message

当我点击一个按钮时,消息框会弹出,并且使用消息框响应中的__doPostback正确处理页面,页面会进行完整的回发。

我宁愿页面执行部分回发及其内容,如果出现错误则显示错误显示分区。任何帮助将不胜感激。

按钮
没什么特别的

<asp:Button ID="ResetSomething" runat="server" Text="ResetSomething" Width="275px" />

这是内容页脚本块

    <script type="text/javascript" language="javascript">
<!--
    function pageLoad() {
        setform();

    };

    function setform() {
        var reset1_button = $('input[id*=ResetSomething]');
        var reset2_button = $('input[id*=ResetSomethingElse]');

        reset1_button.click(function() {
            var element = $(this);
            $.prompt('Message1', { show: 'slideDown', buttons: { Ok: true, Cancel: false },
                submit: function(v, m, f) { submit_reset_callback(v, m, element); }
            });
            return (false);
        });

        var submit_reset_callback = function(result, messages, element) {
            if (result) { __doPostBack("ResetSomething");}
            return (false);
        };

        reset2_button.click(function() {
            var element = $(this);
            $.prompt('Message2', { show: 'slideDown', buttons: { Ok: true, Cancel: false },
                submit: function(v, m, f) { submit_update_callback(v, m, element); }
            });
            return (false);
        });

        var submit_update_callback = function(result, messages, element) {
            if (result) { __doPostBack("ResetSomethingElse"); }
            return (false);
        };
    };     
-->
</script>

这是OnInit背后的代码:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        this.PreLoad += (sender, args) =>
                            {

                                this.ClientScript.GetPostBackEventReference(this, "arg");

                                if (!IsPostBack) { return; }

                                string __targetaction = this.Request["__EVENTTARGET"];
                                string __args = this.Request["__EVENTARGUMENT"];

                                if (string.IsNullOrEmpty(__args)) return;

                                if (__targetaction == "ResetSomething")
                                {
                                    ResetSomething();
                                }
                                if (__targetaction == "ResetSomethingElse")
                                {
                                    ResetSomethingElse();
                                }
                                this.upnlNotifications.Update();
                            };
    }

2 个答案:

答案 0 :(得分:3)

定义下面的功能,并将__doPostBack来电替换为doPostBackAsync(controlId, null)

function doPostBackAsync(eventName, eventArgs) {
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    if (!Array.contains(prm._asyncPostBackControlIDs, eventName)) {
        prm._asyncPostBackControlIDs.push(eventName);
    }

    if (!Array.contains(prm._asyncPostBackControlClientIDs, eventName)) {
        prm._asyncPostBackControlClientIDs.push(eventName);
    }

    __doPostBack(eventName, eventArgs);
}

答案 1 :(得分:0)

controlId应该是生成异步回发的按钮的id,否则页面中会发生完全回发。 为此,您可以将clientidmode用作静态例如

<asp:Button ID="button1" runat="server"  ClientIDMode="Static"/>

   //then you can use below code
   _doPostBack('button1', '');//clientidmode forces buttonid = id given by us

检查一下吗?

如果是这样,那么您可以获得异步回发而不是整页回发。

这对我有帮助。 感谢@Tim的评论。