如何使这个数据控件可以重用于不同的内容和数据?

时间:2013-08-29 20:46:42

标签: asp.net user-controls webforms repeater

我正在使用ASP.NET Web窗体,我有一个Repeater控件来显示一些数据。目前它看起来像这样:

<asp:Repeater runat="server" ID="blah" OnItemDataBound="blah" OnItemCommand="blah">
    <HeaderTemplate>
        <ul class="itemList">
    </HeaderTemplate>
    <ItemTemplate>
        <li runat="server" id="listItem" class="itemNormal" onmouseover="this.className = 'itemHover';" onmouseout="this.className = 'itemNormal';">
            <asp:LinkButton runat="server" ID="btn_select" CommandName="Select" Text="Select" style="display: none;"></asp:LinkButton>
            <strong>Date/Time:</strong> <%# DataBinder.Eval(Container.DataItem, "date") %><br />
            <strong>Details:</strong> <%# DataBinder.Eval(Container.DataItem, "details") %><br />
            <strong>Status:</strong> <%# DataBinder.Eval(Container.DataItem, "status") %><br />
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

此列表具有悬停行为等,我想在我的项目中重复使用相同类型的列表,只是使用不同的数据(实际上只是用<strong>标签替换三行)。但是,我显然不希望每次使用时都进行copypaste和更改,所以我想我会尝试将它变成用户控件:

<asp:Repeater runat="server" ID="blah" OnItemDataBound="blah" OnItemCommand="blah">
    <HeaderTemplate>
        <ul class="itemList">
    </HeaderTemplate>
    <ItemTemplate>
        <li runat="server" id="listItem" class="itemNormal" onmouseover="this.className = 'itemHover';" onmouseout="this.className = 'itemNormal';">
            <asp:LinkButton runat="server" ID="btn_select" CommandName="Select" Text="Select" style="display: none;"></asp:LinkButton>
            <%= DataString %>
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

在CodeBehind的相应课程中:

public string DataString { get; set; }

所以我的主要目标是这样做:

<uc:MyUserControl runat="server" ID="blah" DataString="<strong>Date/Time:</strong><%# DataBinder.Eval(Container.DataItem, "date") %> ETC..." />

但似乎ASP.NET想要在那里评估字符串中的<% %>,然后我尝试了不同的方法来解决它:

<% string theDataString = "<strong>Date/Time:</strong> <%# DataBinder.Eval(Container.DataItem, "date") %>"; %>
<uc:MyUserControl runat="server" ID="blah" DataString='<%= theDataString %>' />

但是我在%>中关闭theDataString再次遇到麻烦,甚至在用{0: %}之类的东西替换之后(为了逃避%符号:不记得确切语法),它确实正确地逃避它,我发现你实际上不能在属性中使用<%= %>,这很烦人。

我的最后一次尝试是在我的页面的CodeBehind中设置DataString,并且HTML <strong>正确呈现,但是ASP.NET没有评估<%# %>并且只是吐了它从字面上看。所以我有点陷入困境,因为我无法想到其他任何东西......(顺便说一句,我还是相对较新的ASP.NET)

我甚至不确定这是一个很好的方法 - 之前我曾想过将它变成一个模板化的用户控件但是这个方法看起来更简单,而且我已经知道该怎么做了,或者我认为。因此,非常感谢任何对此的帮助,谢谢!

编辑:为了清楚起见,我的重点是这个特定控件的 re-usability - 所以我将能够显示不同类型的数据记录在这种样式的列表中(可点击,突出显示行为等)。

1 个答案:

答案 0 :(得分:1)

如果你的目标是让三条线显示为粗体而不是普通文字,那么你最好的选择是使用更适合网站展示的东西,而不是像程序化那样强硬的东西。服务器端用户控制。例如:

<asp:Repeater runat="server" ID="blah" OnItemDataBound="blah" OnItemCommand="blah">
    <HeaderTemplate>
        <ul class="itemList">
    </HeaderTemplate>
    <ItemTemplate>
        <li runat="server" id="listItem" class="itemNormal" onmouseover="this.className = 'itemHover';" onmouseout="this.className = 'itemNormal';">
            <asp:LinkButton runat="server" ID="btn_select" CommandName="Select" Text="Select" style="display: none;"></asp:LinkButton>
            <span class="displayMode">Date/Time:</span> <%# DataBinder.Eval(Container.DataItem, "date") %><br />
            <span class="displayMode">Details:</span> <%# DataBinder.Eval(Container.DataItem, "details") %><br />
            <span class="displayMode">Status:</span> <%# DataBinder.Eval(Container.DataItem, "status") %><br />
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

然后,以编程方式显示:

<style type="text/css">
    .displayMode { font-weight: bold; }
    /* and/or */
    .displayMode { text-decoration: underline; }
</style>

使用正确的工具来完成工作,在这种情况下,我觉得服务器端代码不是完成此任务的正确方法。另一方面,如果您需要更改<li>标记内容的内容,那么您必须在C#中执行此操作。但是,如果是这种情况,您可以轻松地将其绑定到不同的对象或使用不同的控件或继承控件或任何数量的其他方法。对于您的具体情况,只需使用标准的HTML操作技术。