4

私は ASP.NET を初めて使用し、最近リピーターを発見しました。それらを使用する人もいれば、使用しない人もいます。どのソリューションがベストプラクティスになるかわかりません。

私が経験したことから、単純な操作(リストの表示)は単純になりますが、より複雑なことをしたいと思うとすぐに、論理的に複雑さが爆発します。

多分それは私と私が概念をよく理解していないだけなので(これは非常に可能性があります)、私がやろうとしていることと私の問題の例を次に示します:


問題: フォルダ内にあるファイルのリストを表示したい。

解決策:

String fileDirectory = Server.MapPath("/public/uploaded_files/");
String[] files = Directory.GetFiles(fileDirectory);
repFiles.DataSource = files;
repFiles.DataBind();

<asp:Repeater ID="repFiles" runat="server" OnItemCommand="repFiles_ItemCommand" >
        <ItemTemplate>
           <a href="/public/uploaded_files/<%# System.IO.Path.GetFileName((string)Container.DataItem) %>" target="_blank">View in a new window</a> 
           <br />
        </ItemTemplate>  
</asp:Repeater>

これはうまくいきます。


新しい問題: それらのファイルを削除できるようにしたい。

解決策: アイテム テンプレートに削除リンクを追加します。

<asp:LinkButton ID="lbFileDelete" runat="server" Text="delete" CommandName="delete" />

私はイベントをキャッチします:

   protected void repFiles_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName == "delete")
            {
                // ... blah
            }
        }

... じゃあ何?e.Item.DataItem が null であることを知って、ここから削除するファイル パスを取得するにはどうすればよいですか (デバッガーを実行しました)。

ループを使用して同じことを行うことができたのに、リピーターを使用して時間を無駄にしましたか?

他のソリューションよりもリピーターを使用する本当の利点は何ですか?

4

4 に答える 4

9

表示されているように、LinkBut​​ton イベントを確実に処理できます。次のように CommandArgument を LinkBut​​ton に追加できます。

<asp:LinkButton CommandArgument="<%# (string)Container.DataItem %>" ID="lbFileDelete" runat="server" Text="delete" CommandName="delete" />

次に、コードでこれを行うことができます:

string path = e.CommandArgument.ToString();

一般的に、私は Repeater コントロールのファンです。コードを制限し、生成された HTML を高度に制御して、反復処理をすばやく行うことができます。必要に応じて正確に出力を生成する微調整機能があるため、GridView やその他のより複雑なコントロールよりも優れています。

生成された HTML を作成するために大量の HTML をコードに追加しなければ、エラーが少なく、より速く開発できると信じているため、私はループよりもこの方法を好みます。

于 2009-05-28T16:13:15.707 に答える
2

もののリストを表示する場合、Repeater は通常、GridViews、DataLists、およびその他の対応するものよりも高速です。リピーターは、レコードの追加や編集よりも表示に最適ですが、CRUD 操作にリピーターを使用するために必要なものを手動で接続できます。

この例では、ファイル パスをリンク ボタンの CommandArgument プロパティにバインドする必要があります。次に、イベント ハンドラーで e.CommandArgument を使用してパスにアクセスする必要があります。

于 2009-05-28T16:13:47.780 に答える
1

リピーターは独自のコードを追加しないため、同様のオプションよりも高速で柔軟です。ある程度、それらは for ループの美化されたものですが、すべての html コードを同じ場所に保持するため、リピーターを使用する方がおそらく良いと思います。

于 2009-05-28T16:15:53.483 に答える
0

リピーターが絶えない。特に、この種の機能をラップするユーザー コントロールのリピーター。

いずれにせよ、CommandArgument トリックは、特に引数が 1 つだけ必要な場合に、非常にうまく機能します。もう 1 つのトリックは、物事を別のハンドラー (ItemCommand ハンドラーではなく) に配線し、センダーを使用してアイテムに戻り、他のデータを取得することです。すなわち:

<asp:LinkButton CommandArgument="<%# (string)Container.DataItem %>" ID="lbFileDelete" runat="server" Text="delete" OnClick="DeleteFile" />
<asp:Hidden runat="server" id="FileId" value="<%# DataBinder.Eval(Container.DataItem, "ID") %>

そして、コードビハインドで:

protected void DeleteFile(object sender, EventArgs e)
{
   LinkButton clicked = (LinkButton)sender;
   Control container = clicked.NamingContainer;
   int id = int.Parse(((Hidden)container.FindControl("FileId")).Value);
   //do stuff with the id, etc.
}

より複雑なシナリオでは非常に便利です。率直に言って、ASP.NET で、リピーターと少しの工夫で解決できないことはほとんどありません。

于 2009-05-28T21:11:09.630 に答える