从代码强制回发?或者从异步回发中重新加载JavaScript?

时间:2010-05-07 20:38:55

标签: .net javascript jquery-ui updatepanel asynchronous-postback

我有一个Jquery UI对话框,在填写表单后弹出以确认项目的创建。由于表单的各种需要,我在更新面板中有表单,特别是因为我希望在表单上完成验证而不重新加载页面。

JavaScript似乎无法在异步回发上重新加载。这意味着当表单成功并且我将变量'formSubmitPass'更改为true时,它不会通过<%= formSubmitPass%>传递给Javascript。如果我在提交按钮中添加一个触发器来执行完整的回发,它就可以工作。但是,我不希望提交按钮执行完整的回发,因为我说我可以在更新面板中验证表单。

我怎么能这样,所以我的表单异步验证,但是当表单成功完成并且项目保存到数据库时,我的javaScript会正确重新加载?

使用Javascript:

    var formSubmitPass = '<%= formSubmitPass %>';
var redirectUrl = '<%= redirectUrl %>';

function pageLoad() {

    $('#formPassBox').dialog({
        autoOpen: false,
        width: 400,
        resizable: false,
        modal: true,
        draggable: false,
        buttons: {
            "Ok": function() {
                window.location.href = redirectUrl;
            }
        },
        open: function(event, ui) {
            $(".ui-dialog-titlebar-close").hide();
            var t = window.setTimeout("goToUrl()", 5000);
        }
    });

    if(formSubmitPass == 'True')
    {
        $('#formPassBox').dialog({
            autoOpen: true
        });
    }

那么如何从后面的代码中强制回发,或者在异步回发上重新加载JavaScript,或者以一种能够继续执行异步表单验证的方式执行此操作?

编辑:我在后面代码的最后更改了formSubmitPass:

If errorCount = 0 Then
            formSubmitPass = True
            upForm.Update()
        Else
            formSubmitPass = False
        End If

所以在完整的回发中,值确实会发生变化。

3 个答案:

答案 0 :(得分:2)

我听起来更像是更新面板正在替换html,并且你的jQuery选择器没有绑定到新元素。

尝试将.Live用于所有事件,或者在ajax更新后重新绑定(您可以使用UpdatePanel插件)

答案 1 :(得分:0)

不完全确定你要做什么。 <%= formSubmitPass %>肯定不会被重新评估,因为这是一个仅在页面重新加载时设置的服务器变量。即使你再次执行javascript,值也不会改变。

但是,您也可以将succes回调传递给.dialog()方法:

$('#formPassBox').dialog({
  // ...
  success: function(){ 
    // do something, e.g.
    $("#formPassBox").dialog({autoOpen:false});
  }
});

答案 2 :(得分:0)

我想到了这一点,对我有用的是首先将对话框javascript放在page_load中,将auto auto属性设置为false,如下所示:

function pageLoad() {

    $('#formPassBox').dialog({
        autoOpen: false
     });
}

然后创建一个完全独立的函数:

function formSubmitPass() {
    $('#formPassBox').dialog({
        autoOpen: true,
        width: 400,
        resizable: false,
        modal: true,
        draggable: false,
        buttons: {
            "Ok": function() {
                window.location.href = redirectUrl;
            }
        },
        open: function(event, ui) {
            $(".ui-dialog-titlebar-close").hide();
            var t = window.setTimeout("goToUrl()", 10000);
        }
    });
}

然后按照这些问题所示使用RegisterStartupScript:Run javascript after form submission in update panel?What is wrong with ScriptManager.RegisterStartupScript?

我的代码:

ScriptManager.RegisterStartupScript(Me, upForm.GetType(), "AutoPostBackScript", "formSubmitPass();", True)

注意:确保使用ScriptManager NOT ClientScript,第二个参数也使用更新面板上的GetType()。

而不是在后面的代码上使用stringbuilder(Efficient Use of the ASP.NET RegisterStartupScript method),我认为将javaScript放在后面的代码上是笨拙的,我只是创建单独的函数并调用它,这非常有用