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

Prevent ddl from triggering unsaved changes warning while still executing OnSelectedIndexChanged event

本文关键字:保存 警告 ddl 执行 OnSelectedIndexChanged 事件 阻止      更新时间:2023-09-26

我使用这个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服务器代码的执行,所以现在第二个下拉列表中没有填充正确的数据。当下拉列表更改时,我如何防止弹出并仍然执行服务器代码?

问题是级联下拉列表中的return 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",那么您也可以通过服务器端代码对此进行操作,这可能会有所帮助。

编辑:

这与您的预期略有不同。这将跟踪每个表单元素的更改,并将表单标记为已更改(如果有任何更改)。这就是我过去让这种事情发生的原因。我认为在这种情况下,将表单作为一个整体进行跟踪是不可行的,因为您需要排除某些字段。我也会使用一个隐藏字段来跟踪您的更改。

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

删除ASPX 中的OnSelectedIndexChanged

在aspx.cs的PageLoad方法中,请尝试此

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

这里有一个关于如何使用ASP.net框架自动生成的__doPostBack方法的参考。

希望它能帮助你。