Asp.net 脚本似乎从未注册

Asp.net 脚本似乎从未注册,asp.net,vb.net,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.get

我有以下简单的测试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”部分?

您没有添加脚本标记来封装脚本

加法函数

ClientScript.RegisterStartupScript(Me.GetType(), "MyCall", "<script type=\"text/javascript\">MyMsg();</script>", True)
strScript=”“;
strScript=“函数MyMsg()”
strScript+=“{”
strScript+=“警报(document.getElementById('TextBox3').value);”
strScript+=“}”
strScript=“”;
RegisterStartupScript(Me.GetType(),“MyMsg”,strScript,True)
调用函数

ClientScript.RegisterStartupScript(Me.GetType(), "MyCall", "<script type=\"text/javascript\">MyMsg();</script>", True)
ClientScript.RegisterStartupScript(Me.GetType(),“MyCall”,“MyMsg();”,True)
在此整合(并详细说明)对原始问题的评论

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

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

  • 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>
    
    详细介绍了如何使用对象。我来回获取信息的方式是使用附加到请求/响应的标题。您需要使用
    setRequestHeader
    函数添加它们,并从
    getAllResponseHeaders
    函数获取它们。一旦进入服务器端的页面加载事件,您将需要评估请求的标题,如果存在表示按钮被单击的标题(需要手动添加),则可以调用函数并向响应添加标题,该标题将告诉javascript在弹出框中显示什么。我确信使用标题并不是来回获取信息的最佳方法,但如果您只是在谈论只指示向用户打印内容的布尔值,那么您可能不需要经历设置JSON或XML响应的过程。这还假设您在服务器端所做的工作不仅仅是检查按钮被点击的次数,因为如果这就是您所需要做的,您应该使用选项3

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


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

    ClientScript.registerstartupscript的最后一个布尔值是否仍然不添加脚本标记?代码运行正常。正如所指出的,使用“true”无论如何都会添加脚本标记。那么代码如何以及为什么运行得很好呢?更糟糕的是,它仍然不能回答为什么注册测试永远不起作用-我总是得到未注册的文本。为什么不使用AJAX来做这件事,而不是asp按钮导致的完整回发?事实上,如果没有任何回发,从技术上讲,如果没有往返,就不会是AJAX。因此,当然,可以将其设置为100%在浏览器/脚本端运行。简单的基本问题仍然存在:如何让代码的真实部分运行(或者解释为什么大量的代码示例会测试注册的代码,但这些代码不起作用?我认为使用完整回发的问题在于,每次单击asp按钮时,页面都会从技术上重置,因此每次单击时,您以前注册的所有客户端脚本都会被清除。部分回发将保留您已经注册的任何脚本都是完整的,并允许您检查该脚本之前是否已注册。如果您不想实现AJAX或将其全部设置为客户端,那么您可以始终使用会话变量,检查它是否与您的
    If
    相同,而不是检查脚本是否已注册。Excell如果post back重新设置页面,那么这将解释为什么我从未看到脚本注册。奇怪的是,成吨的示例都是这样编写的,他们没有提到这样的代码没有任何用处。为什么成吨的示例都是错误的,没有提到post back重新设置所有加载脚本的简单概念?我没有看到t他在任何地方都提到过。为什么这么多的代码样本都被遗漏了,而所有这些样本都测试了正在加载的脚本?很明显,那些成吨的示例和书籍都以一种愚蠢的方式编写了示例代码。没有看到您提到的示例,这很难说,但有一种方法是使用一个更新面板,即pavisual studio中AJAX扩展的rt。如果将标签和按钮放在更新面板中,则将获得预期的行为。但是按钮的事件处理程序将无法更改