Verwenden von ASPX Web User Control mit Visual Studio 2010
-
27-10-2019 - |
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.
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.