Вызов функции в пользовательском контроле из кода за страницей

Теперь это все упрощено, но здесь идет:

У меня есть пользовательский элемент управления, который состоит только из одного файла * .ascx. Элемент управления не имеет выделенного кода: это просто скрипт с несколькими функциями, например так:

<%@ Control Language="VB" EnableViewState="False" ClassName="MyControlType" %>
<script runat="server">
    Public Function MyFunction() As String
       return "CalledMyFunction!"
    End Function
</script>

Вот и весь файл. Я могу успешно добавить этот элемент управления на страницу aspx, используя разметку следующим образом:

<%@ Register Src="~/path/to/Control.ascx" TagPrefix="aaa" TagName="MyControl" %>
...
<aaa:MyControl runat="server" id="MyControl1" />

Теперь то, что я хочу сделать, это вызвать MyFunction из кода страницы, например:

Dim someString As String = MyControl1.MyFunction()

К сожалению, я не могу этого сделать. Вместо этого я получаю ошибку компиляции с эффектом " 'MyFunction' is not a member of 'System.Web.UI.UserControl'."

Я также попробовал это:

Dim someString As String = DirectCast(MyControl1, MyControlType).MyFunction()

а потом компилятор говорит мне " Type 'MyControlType' is not defined."

Я много играл с этим, и я просто не могу заставить его работать. Все попытки привести MyControl1 к более точному типу потерпели неудачу, как и другие обходные пути. Я подозреваю, что проблема заключается в том, что файл ascx без выделенного кода не может быть скомпилирован в сборку, но выделенный код хочет быть скомпилирован в сборку, и поэтому компилятор запутывается в типе элемента управления.

Что мне нужно сделать, чтобы иметь возможность вызывать эту функцию?

[править]
Так что мне просто нужно добавить код для пользовательского элемента управления. Это то, что я хотел сделать в любом случае. Я все еще хотел бы знать, как сделать это без необходимости, хотя.

11.12.2008 20:51:47
Просто любопытно, нашли ли вы решение или одно из опубликованных решений было тем, что вы искали?
user21826 13.12.2008 14:47:26
Смотрите редактирование: я закончил тем, что создал код для управления.
Joel Coehoorn 13.12.2008 18:52:24
Потому что это не работает. Если это работает для вас, скорее всего потому, что вы разрешили Visual Studio создать элемент управления из его шаблона, а для элемента управления есть кодовый код.
Joel Coehoorn 14.12.2008 22:01:37
Это работает в зависимости от того, какую модель компилятора вы используете - если у вас есть веб-приложение, а не веб-сайт, у вас все еще проблемы.
Joel Coehoorn 17.12.2008 19:18:32
8 ОТВЕТОВ

Убедитесь, что объект MyControl1 в вашем коде позади имеет тип MyControlType и приведен в качестве такового при вызове этой функции. Компилятор утверждает, что не может найти метод MyFunction () в базовом классе UserControl.

0
11.12.2008 20:59:33
Я так много знаю. Попробуйте пример, который я разместил на простой странице, и вы обнаружите, что все не так просто - код не знает ни о каком типе «MyControlType».
Joel Coehoorn 11.12.2008 21:01:29

Я не делаю много VB (больше C # парень), но я думаю, что у меня это работает!

У вас есть опечатка на runat:

<script ruant="server"> 

Попробуйте исправить это, и это работает!

0
11.12.2008 21:35:02
Исправлена ​​опечатка: я проверил, и она написана правильно в реальном коде.
Joel Coehoorn 11.12.2008 21:39:08
Ваш MyControlType наследуется от UserControl?
BigJump 11.12.2008 21:48:23
Я пробовал это в обоих направлениях: помните, однако: кода для управления нет вообще, и я не могу добавить его в данный момент из-за внешних факторов.
Joel Coehoorn 11.12.2008 21:57:33

Я считаю, что вам нужно извлечь из WebUserControl.

В вашем теге .ascx "Control" поместите следующее:

Inherits = "WebApplication1.WebUserControl1"

Конечно, вам нужно использовать правильные имена.

0
11.12.2008 21:50:08

Странно работает для меня.

Imports Microsoft.VisualBasic

Public Class MyControlType
    Inherits UserControl
End Class

,

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="~/WebUserControl.ascx" TagPrefix="aaa" TagName="MyControl"  %>
...
<aaa:MyControl runat="server" id="MyControl1"  />

,

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Dim someString As String = MyControl1.MyFunction()
    End Sub

End Class

,

<%@ Control Language="VB" EnableViewState="False"  %>
<script runat="server">
    Public Function MyFunction() As String
       return "CalledMyFunction!"
    End Function
</script>
3
11.12.2008 21:42:31
Хорошо, последний ход! Код выше все еще работает для меня, если я удаляю класс MyControlType.vb!
BigJump 11.12.2008 21:56:38
Вы также удалили файл .designer.vb?
Joel Coehoorn 11.12.2008 21:58:16
И вы создаете это как веб-сайт или веб-приложение?
Joel Coehoorn 11.12.2008 21:59:15
Да, все, что у меня сейчас есть, это default.aspx, default.aspx.vb и WebUserControl.ascx
BigJump 11.12.2008 22:00:02
Ах, как веб-сайт, так что это может объяснить это!
BigJump 11.12.2008 22:00:43

Проблема связана с отсутствием файла с выделенным кодом, который определяет класс. Как только вы помещаете публичную функцию в файл с выделенным кодом, она работает. Я думаю, что ASP.NET рассматривает эту функцию скорее как анонимную функцию, а не как реальную функцию в классе.

Это моя мысль в любом случае.

0
11.12.2008 23:23:16

Вот что я сделал.

  1. Создать новый веб-сайт.
  2. Добавить новый пользовательский веб-элемент управления. Убедитесь, что вы сняли флажок «Поместить код в отдельный файл» в этом диалоговом окне.
  3. Поместите функцию в сгенерированный .ascx
  4. Зарегистрируйте элемент управления в default.aspx и запустите

Содержимое WebUserControl.ascx

<%@ Control Language="VB" ClassName="WebUserControl" %>

<script runat="server"> Public Function MyFunction() As String Return "CalledMyFunction!" End Function </script>

Содержимое Default.aspx


<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Src="WebUserControl.ascx" TagPrefix="aaa" TagName="MyControl" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <aaa:MyControl runat="server" ID="mycontrolid" />
    <%
        Dim i As String = mycontrolid.MyFunction()
        Response.Write(i)
     %>
    </div>
    </form>
</body>
</html>
0
12.12.2008 02:05:56

Поместите это в свой код за объявлениями

protected <solutionName>.<controlName> myControl1; /*C#*/

здесь myControl1 - это идентификатор вашего пользовательского элемента управления. Теперь вы можете вызывать публичные функции этого элемента управления.

-1
11.03.2010 15:38:22

Вы должны добавить свой код VB в файл VB

Public Function MyFunction() As String
        Return "CalledMyFunction!"
    End Function
-1
5.02.2014 09:06:08