Тег WebForms ScriptManager недоступен в коде VB - PullRequest
3 голосов
/ 30 апреля 2020

У меня есть страница aspx с этим тегом в <body>:

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

Теперь в другом месте страницы aspx у меня есть некоторый VB-код (встроенный в страницу с использованием <% %>, а не в код за файлом vb):

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

Проблема в том, что я получаю ошибку компиляции в этой строке, говорящую, что scriptManager1 не объявлен. Я думал, что все элементы управления с runat="server" доступны в коде? Почему это не работает?

edit:

О, я понял - вроде как. RegisterClientScriptBlock по некоторым причинам является общим методом ScriptManager, поэтому мне нужно вызывать его так:

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

Вызов его как метода экземпляра не будет работать.

Однако - теперь я получаю сообщение о том, что сам класс ScriptManager не существует! Я ссылаюсь на соответствующее пространство имен, например, в верхней части страницы:

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

Почему ScriptManager не найден? Я даже получаю сообщение об ошибке, если я явно ссылаюсь на класс по пространству имен:

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

edit: вот простая страница, которая должна воспроизвести ошибку:

<%@ 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>

edit: пробовал как предлагается та же ошибка:

<%@ 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>

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Исходя из аргументов, которые вы пытаетесь использовать в вызове метода, похоже, что вы смешиваете два отдельных класса:

System.Web.UI.ScriptManager

System.Web.UI.ScriptManager docs ссылка

и

System.Web.UI.ClientScriptManager

System.Web.UI.ClientScriptManager docs ссылка

Первый из этих двух жизней в System.Web.Extensions.dll сборка. Вы проверили, что ссылаетесь на эту сборку?

Вторая доступна через свойство ClientScript класса Page. Я думаю, что должен делать следующим образом (обратите внимание, синтаксис C#, хотя его легко изменить на VB):

<%
    this.ClientScript.RegisterClientScriptBlock(this.GetType(), "mandatoryAdditionalFieldRules_ContactType", "alert('fred');");
%>
0 голосов
/ 06 мая 2020

Я взял ваш пример с вызовом в 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 версии? Тем не менее, надеюсь, это поможет.

0 голосов
/ 04 мая 2020

Проверьте этот пример здесь, похоже, вам может потребоваться вызвать его в Page_PreRender - пример в C#, а не в VB, но предпосылка должна быть такой же. https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.scriptmanager.registerclientscriptblock?view=netframework-4.8

...