c# - ControlParameter 找不到 UserControl 中的控件

标签 c# jquery asp.net custom-controls objectdatasource

我对 ASP.NET 相当陌生,但一直进展顺利,通过一些研究就能克服迄今为止的所有障碍。但我遇到了一个似乎无法解决的小问题,涉及我创建的自定义控件。

该控件是一个通过 JQuery 弹出的小部件,包含允许用户过滤结果集的控件。我将此弹出窗口的所有元素嵌入到两个特定页面中,并且这些页面都工作正常。我决定创建一个自定义控件,并且据我所知,在目标页面上使用带有 Control' 指令和 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'”)。显然这是一个非常简单的事情,但我似乎一辈子都无法简单地弄清楚如何使这项工作发挥作用。我很确定这个问题一定已经在这里解决了,但我找不到例子。

最佳答案

这是我自己对这个“问题”的解决方案,以防有人遇到同样的困难并像我一样疯狂地旋转轮子来寻找答案。首先,这是返回自定义控件的属性的代码片段。我在 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 更改为自定义控件的名称,并添加 PropertyName 属性,该属性引用我在 ascx.cs 文件中定义的属性。

这就是全部内容了。当你看到它时很明显,但它让我困惑了好几个小时。

关于c# - ControlParameter 找不到 UserControl 中的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017948/

相关文章:

c# - IE可枚举垃圾创建

javascript - 我的 Bootstrap 轮播指示器与我的固定顶部导航栏重叠

javascript - 阻止 Cassette v2 缩小 JavaScript 文件

c# - Gridview 选择命令字段未在更新面板中触发

c# - 如何在 Environment.Exit() 之前调用事件?

javascript - 基于eq()选择的点击事件

c# - 缓存与 session 的优势

asp.net - 是否可以根据 C#/ASPNET Webforms 中选定的下拉项来定位数据库条目?

c# - 更改小数的精度

jQuery UI 对话框随机 CSS 属性