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 为空(我运行了调试器),我如何获取要从此处删除的文件路径。

当我可以使用循环来完成同样的事情时,我是否只是浪费了使用中继器的时间,这同样简单,只是 - 可能 - 不那么优雅?

与其他解决方案相比,使用中继器的真正优势是什么?

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 技巧非常有效,尤其是当您只需要一个参数时。另一个技巧是将事物连接到单独的处理程序(而不是 ItemCommand 处理程序),然后使用发送方返回项目并获取其他数据。IE:

<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 回答