javascript - 在 JavaScript 函数中找不到 Hiddenfield 的值

标签 javascript asp.net vb.net

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

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

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

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

最佳答案

好的,我知道该怎么做了。我不会声称这是最优雅的解决方案,但它完全按照我想要的方式工作,所以我很高兴。感谢您的回复。我很感谢您的帮助。

首先,我将隐藏字段更改为 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>

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

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

关于javascript - 在 JavaScript 函数中找不到 Hiddenfield 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17157943/

相关文章:

c# - 如何使 javascript 文件在从母版页继承的任何页面上工作?

.net - 通常最好使用 StringComparison.OrdinalIgnoreCase 或 StringComparison.InvariantCultureIgnoreCase?

vb.net - 在 DirectShow 中预览相机并捕获静态图像 - 在 VB.net 中

javascript - node.js:从模块内与 npm 对话

asp.net - 除非物理文件存在,否则 Global.asax Application_BeginRequest 不会触发 - 404

c# - 我可以在我的 asp.net 代码中访问 Javascript 数组吗?

c# - 在 vb.net 项目上使用时,C# DLL 不起作用

Javascript 对象字面量从另一个属性本身引用另一个属性

javascript - setTimeout 不会导致 'delay'

javascript - 将 YYYY-MM-DD 和 24 小时制更改为格式化日期时间