ASP.NET转发器问题(+关于最佳实践的问题)

mar*_*cgg 4 c# asp.net repeater

我是ASP.NET的新手,最近我发现了中继器.有些人使用它们,有些则不使用,我不确定哪种解决方案是最佳做法.

根据我的经验,它使简单的操作(显示列表)变得简单,但是只要你想做更复杂的事情,复杂性就会爆炸,逻辑明智.

也许只是我和我对这个概念的理解很差(这很有可能),所以这里有一个例子,说明我想做什么和我的问题:


问题:我想显示位于文件夹中的文件列表.

方案:

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

<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>
Run Code Online (Sandbox Code Playgroud)

这很好用.


新问题:我希望能够删除这些文件.

解决方案:我在项目模板中添加了删除链接:

<asp:LinkButton ID="lbFileDelete" runat="server" Text="delete" CommandName="delete" />
Run Code Online (Sandbox Code Playgroud)

我抓住了这个事件:

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

那么什么?知道e.Item.DataItem为空(我运行调试器),如何从此处获取要删除的文件路径.

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

使用中继器而不是其他解决方案的真正优势是什么?

Jer*_*eid 9

您可以在显示时正确处理LinkBut​​ton事件.你可以像这样添加一个CommandArgument到你的LinkBut​​ton:

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

然后在您的代码中,您可以这样做:

string path = e.CommandArgument.ToString();
Run Code Online (Sandbox Code Playgroud)

一般来说,我是Repeater控件的粉丝.它使您能够快速重复,有限的代码和对生成的HTML的高级控制.我比GridView和其他更复杂的控件更喜欢它,因为你有更精细的能力来完全按照你的需要生成输出.

我更喜欢它而不是循环,因为我相信你可以更快地开发,如果你没有在代码中附加大量的HTML来生成HTML,那么错误会更少.