Frage

Ich versuche, ein Web User Control in eine meiner APSX-Seiten zu implementieren, erhalte jedoch weiterhin die folgende Warnung:

Das Element „IntFilter“ ist kein bekanntes Element.Dies kann auftreten, wenn auf der Website ein Kompilierungsfehler vorliegt oder die Datei web.config fehlt.

Das Benutzersteuerelement wird im selben Webprojekt wie die ASPX-Seite definiert.

Frage:
Wie behebe ich diese Warnung (ich möchte das Steuerelement nicht in ein separates Projekt verschieben)?
Was muss ich außerdem tun, um IntelliSense für dieses Steuerelement zu aktivieren, damit ich seine FilterTypeSelection-Eigenschaft über ASPX festlegen kann?

Code für „~/FilterControls/IntFilter.ascx“

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="IntFilter.ascx.vb" Inherits="StaffSupport.Filters.IntegerFilter" %>
<asp:DropDownList ID="typeFilterDropDownList" runat="server">
    <asp:ListItem Selected="True"  Text ="Any"          Value="-1" />
    <asp:ListItem Selected="False" Text ="Equal"        Value= "0" />
</asp:DropDownList><br />
<asp:TextBox ID="TextBox1" runat="server" /><asp:CheckBox ID="CheckBox1" runat="server" Text="Inclusive" /><br />
<asp:TextBox ID="TextBox2" runat="server" /><asp:CheckBox ID="CheckBox2" runat="server" Text="Inclusive" /><br />

Code für „~/FilterControls/IntFilter.ascx.vb“

Namespace Filters
    Public Class IntegerFilter
        Inherits System.Web.UI.UserControl

        Public Enum NumberFilterTypes As SByte
            Any = -1
            Equals = 0
        End Enum

        Public Property FilterTypeSelection As NumberFilterTypes
            Get
                Dim value As SByte
                If Not  Integer.TryParse(typeFilterDropDownList.SelectedValue, value) Then
                    value = -1
                End If

                Return CType(value, NumberFilterTypes)
            End Get
            Set(value As NumberFilterTypes)
                typeFilterDropDownList.SelectedValue = CSByte(value)
            End Set
        End Property

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        End Sub

    End Class
End Namespace

Code für „OpenCases.aspx“

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/StaffSite.Master" CodeBehind="OpenCases.aspx.vb" Inherits="StaffSupport.OpenCases" %>
<%@ Register TagPrefix="filters" TagName="IntFilter" src="~/FilterControls/IntFilter.ascx" %>
<asp:Content ID="bodyContent" ContentPlaceHolderID="cphBody" runat="server">
    ID<br />
    <filters:IntFilter ID="IntFilter1" runat="server" />
</asp:Content>

Code für „OpenCases.aspx.vb“

    Public Class OpenCases
        Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Page.ViewStateMode = UI.ViewStateMode.Disabled
    End Sub

Update 21.02.2012:
Die fehlende Übereinstimmung zwischen „Filter“ und „Filter“ wurde behoben.

Beachten Sie auch, dass, wenn Sie das Steuerelement aus dem Projektmappen-Explorer auf die Seite in der Entwurfsansicht ziehen, die benötigten Referenzen hinzugefügt werden (obwohl es für mich immer noch die Warnung generiert hat).Wenn Sie es in der Quellansicht auf die Seite ziehen, wird dem Element ein A-Tag mit einem href hinzugefügt.

Update 21.02.2012 b:
Habe die Lösung gefunden, siehe meine Antwort unten.

War es hilfreich?

Lösung

Anscheinend müssen Sie sowohl auf die ASCX-Seite verweisen Und die Versammlung.
Wenn Sie die ASCX-Seite aus dem Fenster „Solution Explorer“ in die Entwurfsansicht der Seite ziehen, die Sie bearbeiten, wird die Referenz für die ASCX-Seite hinzugefügt, Sie müssen die Assembly-Referenz jedoch manuell hinzufügen.

OpenCases.aspx

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/StaffSite.Master" CodeBehind="OpenCases.aspx.vb" Inherits="StaffSupport.OpenCases" %>
<%@ Register Assembly="StaffSupport" Namespace="StaffSupport.Filters" TagPrefix="filters" %><%-- Assembly Reference --%>
<%@ Register TagPrefix="filters" TagName="IntFilter" src="~/FilterControls/IntFilter.ascx" %>
<asp:Content ID="bodyContent" ContentPlaceHolderID="cphBody" runat="server">
    ID<br />
    <filters:IntFilter ID="IntFilter1" runat="server" />
</asp:Content>

Notiz:Achten Sie auf Objekttypkollisionen.Folgendes würde zum Beispiel auch funktionieren:

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/StaffSite.Master" CodeBehind="OpenCases.aspx.vb" Inherits="StaffSupport.OpenCases" %>
<%@ Register Assembly="StaffSupport" Namespace="StaffSupport.Filters" TagPrefix="pre1" %><%-- Assembly Reference --%>
<%@ Register TagPrefix="pre2" TagName="IntFilter" src="~/FilterControls/IntFilter.ascx" %>
<asp:Content ID="bodyContent" ContentPlaceHolderID="cphBody" runat="server">
    ID<br />
    <pre1:IntFilter ID="IntFilter1" runat="server" />
</asp:Content>

Aus diesem Grund begann es am Freitag, nachdem ich dies gepostet hatte, bei mir zu funktionieren. Ich hatte ein benutzerdefiniertes Steuerelement hinzugefügt, das System.Web.UI.WebControls.TextBox implementierte, sodass ich es per Drag & Drop aus der Toolbox ziehen konnte.Da es sich im selben Namespace befand, fügte das Steuerelement den Assemblyverweis hinzu, als es das Steuerelement zur Seite hinzufügte.

Notiz:Wenn Sie auf DLL-Dateien verweisen, die in Ihrem Projekt enthalten sind, müssen Sie möglicherweise die Seitenregistrierungen entfernen, erstellen und die Seitenregistrierungen dann wieder hinzufügen.Andernfalls beschwert sich der Compiler möglicherweise darüber, dass sich die DLL-Dateien nicht im Bin befinden.

Aktualisieren: 2013/04/18
Es scheint, dass Sie die Assembly-Referenz nur dann hinzufügen müssen, wenn die UserControl ist nicht im selben Namespace definiert.

  • Wenn das übergeordnete Element in Proj.Presentation definiert ist und das UserControl in Proj.Presentation definiert ist, sollten Sie die Assembly-Referenz nicht benötigen.
  • Wenn das übergeordnete Element in Proj.Page definiert ist und die UserControl in Proj.Page.UserControl definiert ist, sollten Sie die Assembly-Referenz nicht benötigen.
  • Wenn das übergeordnete Element in Proj.Page definiert ist und die UserControl in Proj.UserControl definiert ist, benötigen Sie die Assembly-Referenz.

Andere Tipps

Das Steuerelement wird wie folgt deklariert:

<%@ Register TagPrefix="filters"

und im Markup

<filter:IntFilter

Diese müssen übereinstimmen.

Sie registrieren ein anderes Präfix als das, das Sie verwenden möchten.

Sie können dies entweder ändern:

<filter:IntFilter ID="IntFilter1" runat="server" />

dazu:

<filters:IntFilter ID="IntFilter1" runat="server" />

Oder ändern Sie dies:

<%@ Register TagPrefix="filters" TagName="IntFilter" 

dazu:

<%@ Register TagPrefix="filter" TagName="IntFilter" 
Close Visual Studio, delete the schema cache, and re-open Visual Studio. You can find the schemas under something like:

C:\Users\Pavel\AppData\Roaming\Microsoft\VisualStudio\10.0\ReflectedSchemas

It is safe to delete all files in this folder.

Löschen Sie den Inhalt des obigen Ordners, und alles ist gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top