【问题标题】:WebForms ScriptManager tag inaccessible in VB codeVB 代码中无法访问 WebForms ScriptManager 标记
【发布时间】:2020-08-15 04:57:59
【问题描述】:

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

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

现在在 aspx 页面的其他地方我有一些 VB 代码(使用 &lt;% %&gt; 嵌入到页面中,而不是在 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>

【问题讨论】:

    标签: asp.net vb.net webforms


    【解决方案1】:

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

    System.Web.UI.ScriptManager
    

    System.Web.UI.ScriptManager docs link

    System.Web.UI.ClientScriptManager
    

    System.Web.UI.ClientScriptManager docs link

    这两个中的第一个存在于System.Web.Extensions.dll 程序集中。你检查过你引用了这个程序集吗?

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

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

    【讨论】:

    • 我引用的是System.Web.UI。这两个类有什么区别?为什么它们都存在?
    • @ekolis System.Web.UI 是一个命名空间,您正在导入它。但是几个程序集(~ dll 文件)可以贡献给同一个命名空间。 System.Web.UI.ScriptManager 类从System.Web.Extensions.dll 程序集添加到命名空间。为了在您的项目中使用它,您必须在 Visual Studio 中添加对程序集的引用。
    • @ekolis 你问为什么它们都存在?。我真的不知道,但事实是它们都确实存在。因此,当尝试使用其中之一时,您需要知道哪一个并使用正确的参数调用方法。
    【解决方案2】:

    我在 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 版本是否存在差异?不过,希望这会有所帮助。

    【讨论】:

    • 我尝试将ScriptManager 放入form 标记中,但是当我尝试将它传递给RegisterClientScriptBlock 时,我仍然收到编译错误,说它是未定义的(并且System.Web.UI.ScriptManager 仍然找不到...)
    • 您可以复制我刚刚给您的确切代码,但它对您不起作用?我在 4.6.1 上尝试了那个确切的代码,它对我来说仍然很好。如果那个确切的代码仍然不起作用,那么肯定有其他事情发生,但是如果那个示例对你有用,而你的实际代码仍然不起作用,那么你需要看看两者之间的差异在哪里。跨度>
    【解决方案3】:

    在此处查看此示例,您可能需要在 Page_PreRender 中调用它 - 该示例使用 C# 而不是 VB,但前提应该是相同的。 https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.scriptmanager.registerclientscriptblock?view=netframework-4.8

    【讨论】:

    • 不,试过了,我仍然得到同样的错误。不过谢谢!
    • 好吧,另一个想法,这是一个长远的目标,但请确保您有 System.Web 作为项目级别的参考。最近有一次,我遇到了一种情况,除非我明确将该程序集作为参考,否则我无法访问程序集中的某些内容。
    • 另外,您使用的是哪个版本的 .net?我打算用你的简单页面复制,但是当我复制你的代码时,VS告诉我 registerclientscriptblock 的参数数量错误。
    • System.Web 在我的项目中被引用。我正在使用 .NET Framework 4.6.1 版。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多