脚本似乎永远不会注册

时间:2013-02-12 09:17:51

标签: asp.net vb.net

我有以下简单的测试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部分永远不会运行。

这是状态还是范围问题? (或代码只注入一次的事实)阻止它运行代码块为true?

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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>
    

    这样做会限制按钮在单击时可以更改的内容并导致回发。为了使用它,您还需要在updatepanel之前的任何位置声明Scriptmanager。注册脚本时,您需要使用该脚本管理器RegisterScriptControl功能。

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

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

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