从页面后面的代码调用用户控件中的函数

时间:2008-12-11 20:51:48

标签: .net asp.net user-controls .net-2.0 code-behind

现在这简化了,但这里有:

我的用户控件只包含一个* .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 个答案:

答案 0 :(得分:3)

对我来说很奇怪。

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>

答案 1 :(得分:0)

确保代码隐藏中的MyControl1对象的类型为MyControlType,并在调用该函数时按原样进行转换。编译器声明它无法在UserControl的基类中找到方法MyFunction()。

答案 2 :(得分:0)

我没有做太多的VB(更多的是C#家伙),但我想我已经有了这个工作!

你有关于runat的错字:

<script ruant="server"> 

尝试修复它并且有效!

答案 3 :(得分:0)

我相信你需要从WebUserControl派生。

在.ascx“Control”标记中放置以下内容:

继承= “WebApplication1.WebUserControl1”

当然,您需要使用正确的名称。

答案 4 :(得分:0)

问题与没有定义类的代码隐藏文件有关。只要将公共函数放在代码隐藏文件中,它就可以正常工作。我认为ASP.NET将该函数更像是一个匿名函数而不是类中的实际函数。

无论如何,这是我的想法。

答案 5 :(得分:0)

这就是我的所作所为。

  1. 创建一个新网站。
  2. 添加新的Web用户控件 - 确保取消选中该对话框中的“将代码放在单独的文件中”复选框。
  3. 将函数放在生成的.ascx
  4. 在default.aspx中注册控件并运行
  5. 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>
    

答案 6 :(得分:-1)

将其放在声明后面的代码中

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

此处myControl1是您的用户控件的ID。现在您可以调用此控件的公共函数。

答案 7 :(得分:-1)

您必须在vb文件中添加vb代码

Public Function MyFunction() As String
        Return "CalledMyFunction!"
    End Function