2

私は ASP.NET にはかなり慣れていませんが、順調に進んでおり、これまでのすべてのハードルを少し調査するだけで乗り越えることができました。しかし、私が作成したカスタム コントロールに関連して、回避できないように見える小さな問題があります。

コントロールは、JQuery を介してポップアップする小さなウィジェットであり、ユーザーが結果セットをフィルタリングできるようにするためのコントロールが含まれています。このポップアップのすべての要素を 2 つの特定のページに埋め込みましたが、それらのページはそれぞれ正常に機能していました。Control' directive and aカスタム コントロールを作成することにしましたが、ターゲット ページで Register' ディレクティブを含む ascx ファイルを使用して、私が知る限り正しく作成しました。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PopUp_TopicFilterControl.ascx.cs" Inherits="POD.PopUp_TopicFilterControl" %>

<%@ Register TagPrefix="popup" TagName="TopicFilterControl" Src="~/Controls/PopUp_TopicFilterControl.ascx" %>

「メイン」ページには、選択パラメータ用にカスタム コントロール内のコントロールを参照する必要があるオブジェクト データソースが含まれています。データソースは次のとおりです。

<asp:ObjectDataSource ID="TopicDataSource" runat="server" SelectMethod="GetRecentTopics" TypeName="POD.App_Objects.Topic">
    <SelectParameters>
        <asp:Parameter DefaultValue="12" Name="select_limit" Type="Int32" />
        <asp:ControlParameter DefaultValue="" ControlID="TopicCategoryFilterList" Name="category" Type="String" />
        <asp:ControlParameter DefaultValue="" ControlID="TopicCreatorFilterList" Name="creator" Type="Int32" />
        <asp:ControlParameter DefaultValue="" ControlID="TopicDateAfterFilterText" Name="date_after" Type="String" />
        <asp:ControlParameter DefaultValue="" ControlID="TopicDateBeforeFilterText" Name="date_before" Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

カスタム コントロールの本体は次のとおりです。

<asp:Panel id="TopicFilter_Panel" runat="server" CssClass="PopUp" ClientIDMode="Static" EnableTheming="False" EnableViewState="False" ViewStateMode="Disabled">
    <asp:Panel runat="server" CssClass="PopUp_Heading">
        <h1><a id="TopicFilter_Close" href="#">Close [X]</a></h1>
    </asp:Panel>
    <asp:Panel runat="server" CssClass="PopUp_Body">
        <asp:Table runat="server">
            <asp:TableRow runat="server">
                <asp:TableCell runat="server" HorizontalAlign="Right">
                    By Category:
                </asp:TableCell>
                <asp:TableCell runat="server">
                    <asp:DropDownList
                        ID="TopicCategoryFilterList"
                        runat="server"
                        DataSourceID="TopicCategoryDataSource"
                        DataTextField="value"
                        DataValueField="value"
                        AppendDataBoundItems="True"
                        AutoPostBack="False">
                        <asp:ListItem Selected="True" Value="">&mdash; All &mdash;</asp:ListItem>
                    </asp:DropDownList>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow runat="server">
                <asp:TableCell runat="server" HorizontalAlign="Right">
                    By Author:
                </asp:TableCell>
                <asp:TableCell runat="server">
                    <asp:DropDownList
                        ID="TopicCreatorFilterList"
                        runat="server"
                        DataSourceID="UserDataSource"
                        DataTextField="person_name_full"
                        DataValueField="user_id"
                        AppendDataBoundItems="True"
                        AutoPostBack="False">
                        <asp:ListItem Selected="True" Value="">&mdash; All &mdash;</asp:ListItem>
                    </asp:DropDownList>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow runat="server">
                <asp:TableCell runat="server" HorizontalAlign="Right">
                    By Date (After):
                </asp:TableCell>
                <asp:TableCell runat="server">
                    <asp:TextBox ID="TopicDateAfterFilterText" runat="server" />
                    <ajaxToolkit:CalendarExtender ID="TopicDateAfterCalendarExtender" TargetControlID="TopicDateAfterFilterText" PopupPosition="BottomRight" runat="server" />
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow runat="server">
                <asp:TableCell runat="server" HorizontalAlign="Right">
                    By Date (Before):
                </asp:TableCell>
                <asp:TableCell runat="server">
                    <asp:TextBox ID="TopicDateBeforeFilterText" runat="server" />
                    <ajaxToolkit:CalendarExtender ID="TopicDateBeforeCalendarExtender" TargetControlID="TopicDateBeforeFilterText" PopupPosition="BottomRight" runat="server" />
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow>
                <asp:TableCell ColumnSpan="2" VerticalAlign="Bottom" HorizontalAlign="Center">
                    <asp:Button runat="server" Text="Apply" CssClass="PopUp_Apply" />
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
    </asp:Panel>
</asp:Panel>

私が得ているエラーは、単にオブジェクト データソースがカスタム コントロール内のコントロールを認識していないということです (たとえば、「ControlParameter 'category' にコントロール 'TopicCategoryFilterList' が見つかりませんでした」)。明らかに非常に単純な問題ですが、私の人生では、これを機能させる方法を単純に理解することはできないようです. これはここで対処されたに違いないと確信していますが、例が見つかりません。

4

1 に答える 1

3

この「問題」に対する私自身の解決策は、誰かが同じ問題にぶつかり、私と同じように猛烈に車輪を回転させて答えを見つけた場合に備えています。まず、カスタム コントロールのプロパティを返すコードのスニペットを次に示します。ascx.cs ファイルに次のコードがあります。

public partial class PopUp_TopicFilterControl : System.Web.UI.UserControl
{

    public string TopicCategory
    {
        get { return TopicCategoryFilterList.SelectedValue.ToString(); }
    }

}

ObjectDataSource 内の ControlParameter への変更は次のとおりです。

<asp:ControlParameter
    DefaultValue=""
    ControlID="TopicFilterSelection"
    PropertyName="TopicCategory"
    Name="category"
    Type="String" />

ControlID をカスタム コントロールの名前に変更し、ascx.cs ファイルで定義したプロパティを参照する PropertyName 属性を追加するだけです。

それだけです。あなたがそれを見れば明らかですが、それは私をかなりの時間困惑させました.

于 2012-04-05T16:33:03.433 に答える