防止ddl在仍执行OnSelectedIndexChanged事件时触发未保存的更改警告

时间:2012-01-16 16:23:38

标签: javascript jquery asp.net

我正在使用此jquery代码来检测未保存的更改,并在用户离开之前发出警告。

    var _changesMade = false;
    $(document).ready(function () {

        $('form').bind($.browser.msie ? 'propertychange' : 'change', function () {
            _changesMade = true;
        });

        $(window).bind('beforeunload', function () {
            if (_changesMade)
                return 'There are unsaved changes which will be lost if you continue.';
        });
    });

它工作正常,除了在我有一个级联下拉列表的页面上。我将此代码添加到asp:DropDownList控件

onChange = "_changesMade=false; return false;"

并且它会停止警告,但它也会停止执行OnSelectedIndexChanged服务器代码,所以现在第二个下拉列表没有填充正确的数据。如何更改下拉列表时,如何阻止弹出窗口并仍然执行服务器代码?

2 个答案:

答案 0 :(得分:0)

我不知道这是否是最好的答案,但它可以帮到你。你可以这样试试。

删除OnSelectedIndexChanged

中的ASPX

在aspx.cs的PageLoad方法中试试这个

protected void Page_Load(object sender, EventArgs e)
{
    this.YourDropDownList.Attributes.Add("onchange", "javascript:_changesMade=false; __doPostBack('" + YourDropDownList.ClientId +"','');";    
}

Here对于使用ASP.net框架自动生成的__doPostBack方法可以做些什么有点了解。

希望它对你有所帮助。

答案 1 :(得分:0)

问题是级联下拉列表返回false。这将阻止SelectedIndexChanged触发,因此您需要一个不使用它的解决方案。

如果要将标记放在您不想参与更改跟踪的控件上,例如级联下拉列表中的父级。我可能想要使用notrack(任意名称)这样的类,我可以弹出任何我不想跟踪的控件。

您的跟踪绑定将成为

 $(':input').not('.notrack').bind($.browser.msie ? 'propertychange' : 'change', function ()
 {             
    _changesMade = true;         
 }); 

这意味着你不会穿上

onChange = "_changesMade=false; return false;" 

这个实例中的返回false导致了问题,而这就是需要进行的操作

顺便说一句,我认为您不需要对绑定进行任何特定的浏览器检查。 JQuery会考虑到这一点。我相信下面的代码应该足够了

 $(':input').not('.notrack').bind('change', function ()
 {             
    _changesMade = true;         
 }); 

如果您需要在回发之间跟踪_changesMade标记(从您的描述中看起来像你可能的那样),那么请考虑将值存储在隐藏字段中。如果您创建隐藏字段runat="server",那么您也可以通过服务器端代码对其进行操作,这可能会对您有所帮助。

修改

这与您的预期略有不同。这将跟踪每个表单元素的更改,并将表单标记为已更改(如果有任何更改)。这就是我过去使用这种东西的方式。我不认为在这种情况下跟踪整个表单会起作用,因为您需要排除某些字段。我还会使用隐藏字段来跟踪您的更改。