-1

我有以下简单的测试 asp.net 表单,以及以下 vb.net 加载事件:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim strScript As String

    strScript = "function MyMsg()"
    strScript += "{"
    strScript += "alert(document.getElementById('TextBox3').value);"
    strScript += "}"
    ClientScript.RegisterStartupScript(Me.GetType(), "MyMsg", strScript, True)

End Sub

它只是在调用脚本时显示网页中文本框的上下文。

然后我有这个按钮代码:

Protected Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click


    If ClientScript.IsStartupScriptRegistered("MyCall") Then
        Me.TextBox3.Text = "My text - registered"
    Else
        Me.TextBox3.Text = "my text NOT registered"
    End If

    ClientScript.RegisterStartupScript(Me.GetType(), "MyCall", "MyMsg();", True)

End Sub

但是,单击该按钮时始终显示未注册的文本。所以,代码似乎运行正常。它从文本框中抓取文本没有问题。但是,代码的 True 部分永远不会运行。

这是一个状态或范围问题吗?(或者代码只注入一次的事实)阻止了它运行代码块是真的吗?

如何让上述代码的“真实”部分运行?

4

2 回答 2

0

在此处合并(并详细说明)对原始问题的评论。

问题是 ASP.NET 按钮在每次单击它们时都会导致完整的回发到服务器,并且当页面执行完整的回发时,它会重置所有可能从以前的操作中注册的脚本。这意味着上次单击按钮时注册的任何脚本都将被清除,并且页面在第二次时将不知道任何有关它的信息。

有几种方法可以解决这个问题。

  1. UpdatePanel:我的首选方法是声明所有需要在 AJAX 更新面板内的按钮单击处理程序中操作的控件,例如:

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </ContentTemplate>
    </asp:UpdatePanel>
    

    这样做是限制了按钮在单击时可以更改的内容并导致回发。为了使用它,您还需要在更新面板之前的任何位置声明一个 Scriptmanager。当您注册脚本时,您将需要使用该 scriptmanagersRegisterScriptControl功能。

  2. 手动 AJAX 回发:实现此目的的另一种方法是使用“手动”AJAX 调用。我已经这样做了几次,但它比更新面板版本复杂得多,我不确定我这样做的方式是否是“正确”的方式。首先,您将 ASP 按钮更改为常规的 HTML 输入按钮。在 HTML 按钮上,onclick应该是您指定的 javasciprt 函数。在 javascript 函数中,您需要完成声明 XMLHttpRequst 对象的过程。该站点详细介绍了如何使用该对象。我来回获取信息的方式是使用附加到请求/响应的标头。您需要使用setRequestHeader函数添加它们并从getAllResponseHeaders功能。一旦您进入服务器端的页面加载事件,您将需要评估请求的标头,如果存在表示该按钮被单击(您需要手动添加)的标头,那么您可以调用一个函数并添加响应的标题,它将告诉 javascript 在弹出框中显示什么。我确信使用标题不是来回获取信息的最佳方法,但如果您只是在谈论仅指示向用户打印什么的布尔值,那么您可能不需要完成设置过程JSON 或 XML 响应。这也假设您在服务器端做的不仅仅是检查按钮被点击了多少次,因为如果这就是您需要做的所有事情,您应该使用选项 3。

  3. 实现这一点的最简单方法是使整个事物成为 javascript 函数。在页面上声明一个变量(int)并在加载时将其设置为 0。然后,当单击按钮时,您只需要检查计数器,如果其大于 0 则显示一条消息,如果其为 0 则显示另一条消息。这仅在您的条件非常基本的情况下才有效(它可能会变得非常复杂,但有时那是矫枉过正)。

所以,在我看来,这三个选项应该能够处理你需要做的任何事情。第一个非常易于使用,第二个非常通用,如果您在与服务器的通信中实现 XML 或 JSON,则可以变得非常强大,第三个比每次与服务器通信都要快得多。决定哪个最适合您。

于 2013-02-14T15:51:00.240 回答
0

您没有添加脚本标签来包含您的脚本。

添加功能

strScript = "<script type=\"text/javascript\">";
strScript = "function MyMsg()"
strScript += "{"
strScript += "alert(document.getElementById('TextBox3').value);"
strScript += "}"
strScript = "</script>";
ClientScript.RegisterStartupScript(Me.GetType(), "MyMsg", strScript, True)

调用函数

ClientScript.RegisterStartupScript(Me.GetType(), "MyCall", "<script type=\"text/javascript\">MyMsg();</script>", True)
于 2013-02-12T09:22:21.020 回答