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>

このリストにはホバー動作などがあります。プロジェクト全体で同じスタイルのリストを再利用したいと思いますが、データが異なるだけです (実際には 3 行を<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

3 行を通常のテキストではなく太字で表示することが目標である場合は、動的なサーバー側のユーザー コントロールのようなプログラム的で手間のかかるものよりも、Web サイトの表示に適したものを使用することをお勧めします。例えば:

<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 に答える