现在这简化了,但这里有:
我的用户控件只包含一个* .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文件无法编译到程序集,但代码隐藏需要编译到程序集,因此编译器对控件的类型感到困惑。
我需要做些什么才能调用该功能?
[编辑]
所以我只需要为用户控件添加代码隐藏。无论如何,这就是我想要做的。不过,我仍然想知道如何做到这一点。
答案 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)
这就是我的所作所为。
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