我有以下简单的测试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?
如何才能运行上述代码的“真实”部分?
答案 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按钮会在每次单击时导致完全回发到服务器,当页面执行完整回发时,它会重置可能已从先前操作注册的所有脚本。这意味着上次点击按钮时注册的任何脚本都将被删除,页面第二次就不会知道任何相关内容。
有几种方法可以解决这个问题。
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
功能。
手动AJAX回发:另一种实现此目的的方法是使用“手动”AJAX调用。我已经做了几次,但它比更新面板版本复杂得多,我不确定我做的方式是否是“正确”的方式。首先,您将ASP按钮更改为常规HTML输入按钮。在HTML按钮上,onclick
应该是您指定的javasciprt函数。在javascript函数中,您需要完成声明XMLHttpRequst对象的过程。 This site详细介绍了如何彻底使用该对象。我来回获取信息的方式是使用附加到请求/响应的标头。您需要使用setRequestHeader
函数添加它们,并从getAllResponseHeaders
函数中获取它们。进入服务器端的页面加载事件后,您需要评估请求的标题,如果存在表示单击按钮的按钮(您需要手动添加),则可以调用函数并添加响应的标题将告诉javascript弹出框中显示的内容。我敢肯定使用标题不是来回获取信息的最佳方法,但如果你只是在讨论只给用户指定要打印的布尔值,那么你可能不需要经历设置过程JSON或XML响应。这也假设您在服务器端做的更多,而不仅仅是检查按钮被点击的次数,因为如果你需要这么做,你应该使用选项3.
实现这一目标的最简单方法是使整个事情成为一个javascript函数。在页面上声明一个变量(int)并在加载时将其设置为0。然后,当单击该按钮时,您只需要检查计数器,如果其大于0则显示一条消息,如果其为0则显示不同的消息。这只有在你的情况非常基本的情况下才会起作用(它可能变得非常复杂,但有时候会有点过分)。
所以,在我看来,这三个选项应该能够处理你需要做的事情。第一个是非常简单易用,第二个是非常通用的,如果你在与服务器的通信中实现XML或JSON,它可以变得非常强大,第三个比每次与服务器通信快得多。决定哪一个最合适取决于你。