Вызов функции в пользовательском контроле из кода позади страницы - PullRequest
5 голосов
/ 11 декабря 2008

Теперь все упрощено, но вот так:

У меня есть пользовательский элемент управления, который состоит только из одного * .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 без выделенного кода не может быть скомпилирован в сборку, но выделенный код хочет быть скомпилирован в сборку, и поэтому компилятор запутывается в типе элемента управления.

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

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

Ответы [ 8 ]

3 голосов
/ 12 декабря 2008

У меня странные работы.

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>
0 голосов
/ 05 февраля 2014

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

Public Function MyFunction() As String
        Return "CalledMyFunction!"
    End Function
0 голосов
/ 11 марта 2010

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

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

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

0 голосов
/ 12 декабря 2008

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

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

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

<code></p>

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

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

<p>

Содержимое 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 декабря 2008

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

Это все равно моя мысль.

0 голосов
/ 12 декабря 2008

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

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

Inherits = "WebApplication1.WebUserControl1"

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

0 голосов
/ 12 декабря 2008

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

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

<script ruant="server"> 

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

0 голосов
/ 11 декабря 2008

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

...