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为空(我运行调试器),如何从此处获取要删除的文件路径.
当我可以使用循环完成相同的操作时,我是否只是浪费了时间使用中继器,这本来就是一样简单,只是 - 不那么优雅?
使用中继器而不是其他解决方案的真正优势是什么?
您可以在显示时正确处理LinkButton事件.你可以像这样添加一个CommandArgument到你的LinkButton:
<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,那么错误会更少.