WebForms ScriptManager标记在VB代码中不可访问



我在<body>:中有一个带有此标记的aspx页面

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

现在在aspx页面的其他地方,我有一些VB代码(使用<% %>嵌入在页面中,而不是嵌入在代码隐藏的VB文件中(:

scriptManager1.RegisterClientScriptBlock(Me.GetType(), "mandatoryAdditionalFieldRules_ContactType", tempStr)

问题是,我在那一行得到一个编译错误,说scriptManager1没有声明。我以为runat="server"的所有控件都可以在代码中访问?为什么不起作用?

编辑:

哦,我想明白了——有点。由于某种原因,RegisterClientScriptBlockScriptManager的共享方法,所以我需要这样称呼它:

ScriptManager.RegisterClientScriptBlock(Me.GetType(), "mandatoryAdditionalFieldRules_ContactType", tempStr)

将其作为实例方法调用是不起作用的。

然而,现在我收到一个错误,说ScriptManager类本身不存在!我引用了页面顶部的适当名称空间:

<%@ Import Namespace="System.Web.UI" %>

为什么找不到ScriptManager?如果我通过名称空间显式引用类,我甚至会得到一个错误:

System.Web.UI.ScriptManager.RegisterClientScriptBlock(Me.GetType(), "mandatoryAdditionalFieldRules_ContactType", tempStr)

编辑:这是一个简单的页面,应该会重现错误:

<%@ Page Language="VB" ContentType="text/html" ResponseEncoding="UTF-8" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.IO" %>
<html>
<head>
<title>FRED</title>
</head>
<body>
<asp:ScriptManager ID="scriptManager1" runat="server" />
<%
System.Web.UI.ScriptManager.RegisterClientScriptBlock(Me.GetType(), "mandatoryAdditionalFieldRules_ContactType", "alert('fred');")
%>
</body>
</html>

编辑:按照建议尝试,相同错误:

<%@ Page Language="VB" ContentType="text/html" ResponseEncoding="UTF-8" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender
System.Web.UI.ScriptManager.RegisterClientScriptBlock(Me.GetType(), "mandatoryAdditionalFieldRules_ContactType", "alert('fred');")
End Sub
</script>
<html>
<head>
<title>FRED</title>
</head>
<body>
<asp:ScriptManager ID="scriptManager1" runat="server" />
</body>
</html>

根据您试图在方法调用中使用的参数,看起来有点像您混合了两个独立的类:

System.Web.UI.ScriptManager

System.Web.UI.ScriptManager文档链接

System.Web.UI.ClientScriptManager

System.Web.UI.ClientScriptManager文档链接

这两个中的第一个存在于System.Web.Extensions.dll组件中。是否已检查是否引用了此程序集?

第二个是通过Page类上的ClientScript属性公开的。我认为应该这样做(注意C#语法,应该很容易更改为VB(:

<%
this.ClientScript.RegisterClientScriptBlock(this.GetType(), "mandatoryAdditionalFieldRules_ContactType", "alert('fred');");
%>

在这里检查这个例子,看起来你可能需要在Page_PreRender中调用它——这个例子是在C#而不是VB中,但前提应该是相同的。https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.scriptmanager.registerclientscriptblock?view=netframework-4.8

我用Page_PreRender中的调用获取了您的样本,并进行了一些调整(RegisterClientScriptBlock的不同参数,在脚本管理器周围放置了一个带有runat=server的表单(,我就可以让它为我工作了。

<%@ Page Language="VB" ContentType="text/html" ResponseEncoding="UTF-8" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.UI" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender
System.Web.UI.ScriptManager.RegisterClientScriptBlock(scriptManager1, Me.GetType(), "mandatoryAdditionalFieldRules_ContactType", "alert('fred');", True)
End Sub
</script>
<html>
<head>
<title>FRED</title>
</head>
<body>
<form runat="server">
<asp:ScriptManager ID="scriptManager1" runat="server" />
</form>
</body>
</html>

我不知道为什么RegisterClientScriptBlock的参数不同,所以我想知道.NET版本是否有差异?尽管如此,希望这能有所帮助。

最新更新