【问题标题】:Triggering a postback from Javascript fails从 Javascript 触发回发失败
【发布时间】:2010-11-17 01:44:29
【问题描述】:

如果某个条件为真,我会尝试触发回发。最初,用户将单击我的表单上的按钮,服务器会做一些工作,在做这些工作的过程中,它会为隐藏字段分配值“1”。当页面在第一次回发后重新加载时,我正在尝试使用 javascript 检查隐藏字段,如果它是“1”,我需要再次回发页面,以便服务器端可以进行一些额外的处理。这样做的原因是我可以从后面的 C# 代码在表单上创建控件,并在 1 个用户交互中下载文件。这是我目前所拥有的:

<script type="text/javascript" language="JavaScript">
        function atload() {
            var HWInfo = document.getElementById('HiddenHW').value;
            if (HWInfo == '1') {
                alert("flag has been set");

                __doPostBack('<%= hdnHidden.UniqueID  %>', '');
             }

        }
        $(document).ready(atload);

    </script>

表示标志已正确设置的警报会触发,但 __doPostBack 不会。在我的 ASPX 文件中,相关部分如下:

 <form id="InventoryForm" runat="server">

<div>
    <asp:Label ID="lblClientList" runat="server" Text="Client List"></asp:Label>
    <asp:DropDownList ID="comboClientList" runat="server"></asp:DropDownList>
    <asp:Label ID="spacer1" runat="server" Text="     "></asp:Label>
    <asp:Button ID="btnGenerateHWReport" runat="server" Text="Generate Hardware Inventory Report" />
    <asp:Label ID="spacer2" runat="server" Text="     "></asp:Label>
    <asp:Button ID="btnGenerateSWReport" runat="server" Text="Generate Software Inventory Report" />
    <br />
    <br />

    <asp:Panel ID="MissingCompPanel" runat="server"></asp:Panel>
    <asp:HiddenField ID="HiddenHW" runat="server" Value="0" />
    <asp:HiddenField ID="hdnHidden" runat="server" />

</div>
</form>

我可以告诉回发永远不会触发,因为我在 Page_Load C# 代码隐藏中的断点永远不会被触发。我几乎在每一行都有断点:

        if (!Page.IsPostBack)
        {
            // Page is not a postback, this is the first visit here
            string foo = HiddenHW.Value;
        }
        else
        {
            // Page is a postback and not initial load
            string foo = HiddenHW.Value;
        }

为什么我的 __doPostBak 在警报没有触发后没有触发,有没有更好的方法来做到这一点?我想要的最终结果是,如果我的隐藏字段是“1”,那么我希望我的第二次服务器访问 1)实际发生并且 2)知道隐藏字段是“1”而不是默认的“0”。

谢谢!

【问题讨论】:

    标签: c# javascript asp.net postback


    【解决方案1】:

    以编程方式单击提交按钮并让它像往常一样调用 __doPostBack 怎么样?

    【讨论】:

    • 我最终创建了一个不可见的虚拟按钮,调用它的 onclick 事件,并且它起作用了。
    【解决方案2】:

    尝试在页面上调用 __doPostBack 方法而不是隐藏控件

    __doPostBack('__Page', '');
    

    【讨论】:

    • 当我尝试那个时没有骰子。我还删除了警报以防万一。我在第一次服务器访问期间创建控件并将它们添加到表单中这一事实是否重要?
    • 做一些实验,使用 FireFox + Firebug 并检查调用 javascript 时控制台中是否出现任何错误,以及 Net 选项卡是否将任何请求记录回服务器
    【解决方案3】:

    当您获得 HiddenHW 的值时,您使用的 ID 不正确。如果您查看呈现的源代码,控件的 ID 类似于 ctl00_HiddenHW。要获取该 ID,您应该使用 HiddenHW.ClientID。我相信__doPostBack 也需要 ClientID,而不是 UniqueID。

    function atload() {
        var HWInfo = document.getElementById('<%= HiddenHW.ClientID %>').value;
        if (HWInfo == '1') {
            alert("flag has been set");
    
            __doPostBack('<%= hdnHidden.ClientID %>', '');
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2016-03-15
      • 2015-01-07
      • 2015-05-23
      相关资源
      最近更新 更多