Использование пользовательского веб-элемента управления ASPX с Visual Studio 2010

Я пытаюсь внедрить веб-элемент управления пользователя на одну из моих страниц APSX, но продолжаю получать следующее предупреждение:

Элемент «IntFilter» не является известным элементом. Это может произойти, если на веб-сайте возникла ошибка компиляции или отсутствует файл web.config.

Пользовательский элемент управления определяется в том же веб-проекте, что и страница aspx.

Вопрос:
Как устранить это предупреждение (я не хочу перемещать элемент управления в отдельный проект)?
Кроме того, что мне нужно сделать, чтобы включить IntelliSense для этого элемента управления, чтобы я мог установить его свойство FilterTypeSelection из ASPX?

Код для "~/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 />

Код для "~/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

Код для «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>

Код для «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

Обновление от 21 февраля 2012 г.
Исправлено несоответствие "фильтров" и "фильтров".

Также следует отметить, что если вы перетащите элемент управления из обозревателя решений на страницу в представлении «Дизайн», он добавит нужные вам ссылки (хотя для меня он все еще генерировал предупреждение). Если вы перетащите его на страницу в исходном виде, он добавит к элементу тег с href.

Обновление 2012/02/21 b:
Решение найдено, см. мой ответ ниже.


person Trisped    schedule 18.02.2012    source источник
comment
Я думаю, вам нужно добавить ссылку на этот элемент управления в свой проект.   -  person COLD TOLD    schedule 18.02.2012


Ответы (4)


По-видимому, вы должны ссылаться как на страницу ASCX, и на сборку.
Если вы перетащите страницу ASCX из окна «Обозреватель решений» в представление «Дизайн» для страницы, которую вы редактируете, она добавит ссылку на страницу ASCX, но вам придется добавить ссылку на сборку вручную.

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>

Примечание: остерегайтесь коллизий типов объектов. Например, следующее также будет работать:

<%@ 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>

Вот почему он начал работать для меня в пятницу после того, как я опубликовал это, я добавил пользовательский элемент управления, который реализовал System.Web.UI.WebControls.TextBox, чтобы я мог перетаскивать его из панели инструментов. Поскольку он находился в том же пространстве имен, элемент управления добавил ссылку на сборку при добавлении элемента управления на страницу.

Примечание. Если вы ссылаетесь на файлы dll, содержащиеся в вашем проекте, вам может потребоваться удалить регистрацию страниц, построить, а затем снова добавить регистрации страниц. В противном случае компилятор может пожаловаться, что файлы dll находятся не в корзине.

Обновление: 18 апреля 2013 г.
Похоже, вам нужно добавить ссылку на сборку только в том случае, если UserControl не определено в том же пространстве имен.

  • Если родитель определен в Proj.Presentation, а UserControl определен в Proj.Presentation, то ссылка на сборку не нужна.
  • Если родитель определен в Proj.Page, а UserControl определен в Proj.Page.UserControl, то ссылка на сборку не нужна.
  • Если родительский элемент определен в Proj.Page, а UserControl определен в Proj.UserControl, вам потребуется ссылка на сборку.
person Trisped    schedule 22.02.2012

Элемент управления объявляется как:

<%@ Register TagPrefix="filters"

и в разметке

<filter:IntFilter

Они должны совпадать.

person Adrian Iftode    schedule 18.02.2012

Вы регистрируете префикс, отличный от того, который вы пытаетесь использовать.

Вы можете либо изменить это:

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

к этому:

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

Или измените это:

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

к этому:

<%@ Register TagPrefix="filter" TagName="IntFilter" 
person sngregory    schedule 18.02.2012

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.

Удалите содержимое указанной выше папки, и все будет хорошо.

person duc14s    schedule 26.06.2014