在javascript函数中找不到隐藏字段的值

时间:2013-06-17 22:31:31

标签: javascript asp.net vb.net

我花了几天时间研究我的问题并且无法让它正常工作。我知道这里有一些与这个问题有关的主题,阅读它们对我有所帮助,但我有点陷入困境,并希望能朝着正确的方向前进。

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

我正在使用会话对象在每个页面上存储对象集合,并且如果用户尝试更改下拉列表的值或者在有待处理操作时离开页面,则希望用户提示对话框。在这里和其他地方进行了大量研究之后,我决定在页面上创建一个隐藏字段,并在每次在服务器端更新操作集合时更新其值。然后我想评估该值,如果它大于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函数找到隐藏的控件。但是,我无法弄清楚的是为什么函数找不到隐藏的字段值。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

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

首先,我将隐藏字段更改为telerik RadTextBox并将其设置为不显示。 RadTextBox看起来与RadGrid的效果比隐藏场更好。

<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>

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

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;
    }
}

另外,我有一个save和undo按钮,在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"  />