2

我正在尝试让自定义控件在VB ASP.Net中工作

我已经阅读了一些主题,但它似乎对我没有多大帮助。我有一个解决方案,包括:

  • 名为“SiteCI”的网站项目
  • 名为“SiteCI-classes”的类库项目

网站项目有对库项目的引用,库DLL在网站项目的bin文件夹内正确生成。

当我在网站项目中创建一个随机类时,我可以通过键入以下内容访问名为 MailLink 的测试控制类:

SiteCI_classes.Controls.MailLink

它完美运行,Visual Studio 向我建议,因此两个项目之间的链接设置正确

请注意,我每次都清理/重建项目以查看它是否真的有效,所以这不是 DLL 构建不正确的问题。

在 system.web -> pages -> controls 我添加的 Web Config 文件中:

<add assembly="SiteCI-classes" namespace="Controls" tagPrefix="custom" />

但是在我添加时在 ASP.Net 页面上:

<custom:MailLink runat="server" id="test1"></custom:MailLink>

我收到未知服务器标签“自定义:MailLink”错误。

为了检查我在输入 web 配置文件时是否出错,我尝试将 SiteCI-classes 更改为 SiteCI_classes,但我收到一条错误消息,说它无法加载程序集,所以我猜那部分没问题,然后我尝试更改*namespace="SiteCI_classes.Controls"*namespace="SiteCI-classes.Controls"中的 namespace= "Controls "并没有解决未知的服务器标签问题。

我不知道该怎么办......它应该工作,不是吗?

这是 MailLink.vb,它位于Library 项目的Controls文件夹中。这是我在 Microsoft 页面上选择的一门课程,仅用于测试目的。

如果有人能给我关于检查内容的提示,我将不胜感激。

Namespace Controls
    < _
    AspNetHostingPermission(SecurityAction.Demand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    AspNetHostingPermission(SecurityAction.InheritanceDemand, _
        Level:=AspNetHostingPermissionLevel.Minimal), _
    DefaultProperty("Email"), _
    ParseChildren(True, "Text"), _
    ToolboxData("<{0}:MailLink runat=""server""> </{0}:MailLink>") _
    > _
    Public Class MailLink
        Inherits WebControl

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The e-mail address.") _
        > _
        Public Overridable Property Email() As String
            Get
                Dim s As String = CStr(ViewState("Email"))
                If s Is Nothing Then s = String.Empty
                Return s
            End Get
            Set(ByVal value As String)
                ViewState("Email") = value
            End Set
        End Property

        < _
        Bindable(True), _
        Category("Appearance"), _
        DefaultValue(""), _
        Description("The text to display on the link."), _
        Localizable(True), _
        PersistenceMode(PersistenceMode.InnerDefaultProperty) _
        > _
        Public Overridable Property Text() As String
            Get
                Dim s As String = CStr(ViewState("Text"))
                If s Is Nothing Then s = String.Empty
                Return s
            End Get
            Set(ByVal value As String)
                ViewState("Text") = value
            End Set
        End Property

        Protected Overrides ReadOnly Property TagKey() _
            As HtmlTextWriterTag
            Get
                Return HtmlTextWriterTag.A
            End Get
        End Property


        Protected Overrides Sub AddAttributesToRender( _
            ByVal writer As HtmlTextWriter)
            MyBase.AddAttributesToRender(writer)
            writer.AddAttribute(HtmlTextWriterAttribute.Href, _
                "mailto:" & Email)
        End Sub

        Protected Overrides Sub RenderContents( _
            ByVal writer As HtmlTextWriter)
            If (Text = String.Empty) Then
                Text = Email
            End If
            writer.WriteEncodedText(Text)
        End Sub

    End Class
End Namespace
4

1 回答 1

0

我发现问题似乎只是由项目名称中的破折号(“-”)引起的。

该项目的名称仍然是“SiteCI-Classes” ,WebConfig 的最终代码不同:

<add assembly="SiteCIClasses" namespace="SiteCI2KClasses.Controls" tagPrefix="cc1" />

注意两者的区别。ASP.Net 3.5 将无法识别项目名称中的破折号并似乎将其删除:如果您尝试将其设置为 SiteCI-Classes 它将最终出现类似未找到组件的错误。

于 2012-10-20T18:53:09.593 回答