1

我花了几天时间研究我的问题,但无法让它正常工作。我知道这里有一些与此问题相关的主题,阅读它们对我有所帮助,但我遇到了一些障碍,希望能朝着正确的方向前进。

我编写了一个小型 .NET 3.5 VB.NET Web 应用程序,允许用户维护一些数据。它由 3 页组成。我不完全喜欢的一个要求是,用户希望进行所有更改,然后在最后单击保存按钮,而不是每次将更改应用到网格时都保存回数据库。

我正在使用会话对象在每个页面上存储对象集合,并希望在用户尝试更改下拉列表的值或在有待处理操作时离开页面时通过对话框提示用户。经过这里和其他地方的大量研究,我决定在页面上创建一个隐藏字段,并在每次在服务器端更新动作集合时更新其值。然后我想评估该值,如果它大于 0,我想提示用户保存更改。

我的功能:

<telerik:RadCodeBlock ID="RadCodeBlock2" runat="server">
    <script type="text/javascript">
        window.onbeforeunload = confirmExit;
        function confirmExit()
        {
            var actionCount = $get('<%=ActionCounterField.ClientID %>').value;
            if (actionCount > 0) {
                alert("Pending Changes!");
                  }
            }

        </script>
    </telerik:RadCodeBlock>

我的隐藏字段声明:

<asp:HiddenField id="ActionCounterField" runat="server" />

我的服务器端代码:

Protected Sub UpdateActionCount()

    ActionCounterField.Value = GoalCategoryActionList.Count

End Sub

当我调试应用程序并将记录添加到我的网格时,服务器端代码会正确执行。我还验证了隐藏控件是由 javascript 函数找到的。但是,我无法弄清楚为什么函数找不到隐藏字段值。

任何帮助是极大的赞赏。谢谢!

4

1 回答 1

0

好的,我想出了如何做到这一点。我不会声称它是最优雅的解决方案,但它完全按照我想要的方式工作,所以我很高兴。感谢您的回复。我很感激帮助。

首先,我将隐藏字段更改为 Telerik RadTextBox 并将其设置为不显示。RadTextBox 在 RadGrid 上的表现似乎比 hiddenfield 好。

<telerik:RadTextBox id="ActionCounterField" runat="server" style="display: none;" AutoPostBack="true" />

然后我将它连接到 AjaxManager 中,以便由我的 RadGrid 更改。

<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
    <AjaxSettings>
        <telerik:AjaxSetting AjaxControlID="RadGrid1">
            <UpdatedControls>
                <telerik:AjaxUpdatedControl ControlID="ActionCounterField"></telerik:AjaxUpdatedControl>
            </UpdatedControls>
        </telerik:AjaxSetting>
    </AjaxSettings>
</telerik:RadAjaxManager>

我有条件地调用确认功能。当我的用户点击保存或撤消按钮时,更改将保留到数据库或在没有确认的情况下撤消。但是,如果他们尝试以任何其他方式离开页面,则会提示他们保存更改。如果他们点击“确定”,则在服务器端调用保存按钮处理程序。如果他们点击“取消”,则调用撤消按钮处理程序。

var allowConfirm = true
window.onbeforeunload = confirmExit;
function confirmExit()
{
    var actionCountHolder = document.getElementById("<%=ActionCounterField.ClientID %>");
    var actionCount = actionCountHolder.value;
    if (allowConfirm == true) 
    {
        if (actionCount > 0) 
        {
            var conf = confirm("You have pending changes.  Save them?");
            if (conf == true) 
            {
                var saveButton = document.getElementById("<%=btnSave.ClientID %>");
                saveButton.click()
            }
            else 
            {
                var cancelButton = document.getElementById("<%=btnCancel.ClientID %>");
                cancelButton.click();
            }
        }
    }
    else {
        allowConfirm = true;
    }
}

此外,我有保存和撤消按钮调用其 OnClientClick 操作上的 disableConfirm 函数。

<asp:Button ID="btnSave" OnClick="btnSave_Click" OnClientClick="disableConfirm()" runat="server" Text="Apply"  />
<asp:Button ID="btnCancel" OnClick="btnUndo_Click" OnClientClick="disableConfirm()" runat="server" Text="Undo"  />
于 2013-06-19T14:31:53.950 回答