0

我正在使用 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>)。但是,我显然不想在每次使用时都复制粘贴并更改它,所以我想我会尝试将其变成用户控件:

<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: %}(为了逃避 % 符号:不记得确切的语法),它确实正确地逃避了它,我发现你实际上不能使用里面的<%= %>一个属性,这很烦人。

我最后的尝试是DataString在我的页面的 CodeBehind 中设置,并且 HTML<strong>正确呈现,但是 ASP.NET 没有评估它<%# %>,只是按字面意思吐出来。所以我有点卡住了,因为我想不出其他任何东西......(顺便说一下,我对 ASP.NET 还是比较陌生)

我什至不确定这是否是一个好方法——以前我曾考虑将它变成一个模板化的用户控件,但这种方法似乎更简单,而且我已经知道该怎么做,或者我是这么认为的。因此,我们将不胜感激任何帮助,谢谢!

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

4

1 回答 1

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 操作技术。

于 2013-08-29T22:08:14.713 回答