0

我正在尝试使用 ScriptManager.RegisterClientScriptBlock 获取我在服务器端调用的 Javascript 函数的返回。

目前,我的 javascript 函数将值保存在 UpdatePanel 中包含的 HiddenField 中。当我调用方法时,我运行 ScriptManager.RegisterClientScriptBlock ,然后获取 HiddenField 的值,但总是返回上一次调用的值。这里我展示代码:

我的用户控制 ASPX 端:

<script>

var num = 0;

function getReturn() {

    num = num + 1;
    var hr= document.getElementById('<%= hdf.ClientID %>');
    hRetorno.value = num;

}
</script>

...

<asp:UpdatePanel ID="up1" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:HiddenField ID="hdf" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

我的用户控制服务器端代码:

    public String GetReturn()
    {
        return MyControl.jsGetReturn(this.Page, this.hdf);
    }

    private static String jsGetReturn(Page page, HiddenField hid)
    {
        ScriptManager.RegisterStartupScript(page, page.GetType(), "key", "getReturn();", true);

        return hid.Value;

    }

索引页 ASPX 侧:

        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>

        <div style="width:720px; height:480px;">
            <uc1:MyControl runat="server" id="MyControl1"/>
        </div>

        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>

                <asp:Button ID="btn" runat="server" OnClick="btn_Click" />
                <asp:TextBox ID="txt" runat="server" ></asp:TextBox>

            </ContentTemplate>
        </asp:UpdatePanel>

索引页面服务器端代码:

    protected void btn_Click(object sender, EventArgs e)
    {
        txt.Text = MyControl1.GetReturn();
    }
4

1 回答 1

1

你不能同时做这些事情。

  1. RegisterClientScriptBlock通过或使用 javascript 从服务器端代码设置隐藏字段的值RegisterStartupScript
  2. 并同时在服务器端代码中检索隐藏的字段值。

这是因为,(更改的)隐藏字段值仅在有回发时才可用于服务器端代码,当您从服务器端设置值时,不会发生回发,这就是为什么您总是得到以前的值,即发布回页面的旧值。

编辑

当您调用RegisterClientScriptBlockorRegisterStartupScript时,它不会JS立即调用,而是根据您使用的内容附加一个javascript call之前或之后的标签,并在文档加载时调用它们,这意味着在您调用时,它将设置隐藏字段的值在文档加载中, -不会有更新的值,因为它还没有通过文档加载增加。<form..jsGetReturnRegisterStartupScripthid.Value

于 2014-11-13T18:17:44.753 回答