5

现在这一切都被简化了,但这里是:

我有一个仅包含一个 *.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 文件无法编译为程序集,但代码隐藏想要编译为程序集,因此编译器对控件的类型感到困惑。

我需要做什么才能调用该函数?

[编辑]
所以我只需要为用户控件添加代码隐藏。无论如何,这是我想做的。不过,我仍然想知道如何在不需要的情况下做到这一点。

4

8 回答 8

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>
于 2008-12-11T21:42:31.150 回答
0

这就是我所做的。

  1. 创建一个新网站。
  2. 添加新的 Web 用户控件 - 确保取消选中该对话框上的“将代码放在单独的文件中”复选框。
  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>
于 2008-12-12T01:45:44.450 回答
0

我做的 VB 不多(更像是一个 C# 人),但我认为我已经完成了这项工作!

你在 runat 上有一个错字:

<script ruant="server"> 

尝试修复它,它的工作原理!

于 2008-12-11T21:35:02.523 回答
0

我相信你需要从 WebUserControl 派生。

在您的 .ascx“控制”标签中放置以下内容:

继承="WebApplication1.WebUserControl1"

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

于 2008-12-11T21:41:33.897 回答
0

确保代码隐藏中的 MyControl1 对象是 MyControlType 类型,并且在调用该函数时被强制转换。编译器声明它在 UserControl 的基类中找不到方法 MyFunction()。

于 2008-12-11T20:59:33.403 回答
0

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

反正这是我的想法。

于 2008-12-11T23:23:16.720 回答
-1

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

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

这里 myControl1 是您的用户控件的 id。现在你可以调用这个控件的公共函数了。

于 2010-03-11T15:38:22.960 回答
-1

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

Public Function MyFunction() As String
        Return "CalledMyFunction!"
    End Function
于 2014-02-05T09:06:08.887 回答