1

APSX ページの 1 つに Web ユーザー コントロールを実装しようとしていますが、次の警告が引き続き表示されます。

要素 'IntFilter' は既知の要素ではありません。これは、Web サイトにコンパイル エラーがある場合、または web.config ファイルが見つからない場合に発生する可能性があります。

ユーザー コントロールは、aspx ページと同じ Web プロジェクトで定義されます。

質問:
この警告を解決するにはどうすればよいですか (コントロールを別のプロジェクトに移動したくありません)。
また、このコントロールの IntelliSense を有効にして ASPX から FilterTypeSelection プロパティを設定できるようにするにはどうすればよいですか?

「~/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 更新:
"filters" と "filter" のミスマッチを修正。

また、ソリューション エクスプローラーからデザイン ビューのページにコントロールをドラッグすると、必要な参照が追加されます (まだ警告が生成されていました)。ソースビューのページにドラッグすると、要素に href を持つタグが追加されます。

更新 2012/02/21 b:
解決策が見つかりました。以下の私の回答を参照してください。

4

4 に答える 4

2

どうやら、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 ファイルがビンにないと文句を言うかもしれません。

更新: 2013/04/18アセンブリ参照が同じ名前空間で定義されていない
場合にのみ、アセンブリ参照を追加する必要があるようです。UserControl

  • 親が Proj.Presentation で定義され、親が Proj.Presentation で定義されているUserControl場合、アセンブリ参照は必要ありません。
  • 親が Proj.Page で定義され、親が Proj.Page.UserControl で定義されているUserControl場合、アセンブリ参照は必要ありません。
  • 親が Proj.Page で定義され、親が Proj.UserControl で定義されている場合UserControlは、アセンブリ参照が必要です。
于 2012-02-22T02:03:14.497 に答える
1

コントロールは次のように宣言されます。

<%@ Register TagPrefix="filters"

そしてマークアップで

<filter:IntFilter

これらは一致する必要があります。

于 2012-02-18T05:14:15.243 に答える
1

使用しようとしているプレフィックスとは異なるプレフィックスを登録しています。

これは次のいずれかで変更できます。

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

これに:

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

またはこれを変更します:

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

これに:

<%@ Register TagPrefix="filter" TagName="IntFilter" 
于 2012-02-18T08:23:10.570 に答える
0
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.

上記のフォルダーの内容を削除すると、すべて問題ありません。

于 2014-06-26T07:46:28.087 に答える