Использование ASPX Web User Control с 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
Обновление 2012/02/21:
Исправлена ошибка "фильтры" и "фильтра".
Также следует отметить, что если вы перетащите элемент управления из обозревателя решений на страницу в представлении "Дизайн", он добавит необходимые ссылки (хотя он все еще генерировал для меня предупреждение). Если вы перетащите его на страницу в исходном виде, он добавит тег с href к элементу.
Обновление 2012/02/21 б:
Нашел решение, см. Мой ответ ниже.
4 ответа
Очевидно, вы должны ссылаться как на страницу ASCX, так и на сборку.
Если вы перетащите страницу ASCX из окна "Solution Explorer" в представление "Дизайн" для редактируемой страницы, она добавит ссылку на страницу 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-файлы отсутствуют в корзине.
Обновление: 2013/04/18
Похоже, вам нужно только добавить ссылку на сборку, если UserControl
не определен в том же пространстве имен.
- Если parrent определен в Proj.Presentation и
UserControl
определяется в Proj.Presentation, тогда вам не понадобится ссылка на сборку. - Если parrent определен в Proj.Page и
UserControl
определяется в Proj.Page.UserControl, тогда вам не нужна ссылка на сборку. - Если parrent определен в Proj.Page и
UserControl
определяется в Proj.UserControl, тогда вам нужна ссылка на сборку.
Элемент управления объявлен как:
<%@ Register TagPrefix="filters"
и в разметке
<filter:IntFilter
Они должны совпадать.
Вы регистрируете префикс, отличный от того, который вы пытаетесь использовать.
Вы можете изменить это:
<filter:IntFilter ID="IntFilter1" runat="server" />
к этому:
<filters:IntFilter ID="IntFilter1" runat="server" />
Или измените это:
<%@ Register TagPrefix="filters" TagName="IntFilter"
к этому:
<%@ 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.
Удалите содержимое этой папки, и все хорошо.