我是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为空(我运行调试器),如何从此处获取要删除的文件路径。
当我使用循环完成相同的操作时,我是否只是浪费了时间来使用中继器,这本来就是一样简单,只是 - 不那么优雅?
使用中继器而不是其他解决方案的真正优势是什么?
答案 0 :(得分:9)
您可以在显示时正确处理LinkButton事件。你可以像这样在你的LinkButton中添加一个CommandArgument:
<asp:LinkButton CommandArgument="<%# (string)Container.DataItem %>" ID="lbFileDelete" runat="server" Text="delete" CommandName="delete" />
然后在你的代码中你可以这样做:
string path = e.CommandArgument.ToString();
一般来说,我是Repeater控件的粉丝。它使您能够快速重复,有限的代码和对生成的HTML的高级控制。我比GridView和其他更复杂的控件更喜欢它,因为你有更精细的能力来完全按照你的需要生成输出。
我更喜欢它而不是循环,因为我相信如果你没有在代码中附加大量的HTML来制作生成的HTML,你可以更快地开发,错误更少。
答案 1 :(得分:2)
为了显示事物列表,Repeater通常比GridViews,DataLists和其他对应物更快。中继器最适合显示,而不是添加和编辑记录,尽管您可以手动连接使用中继器进行CRUD操作所需的内容。
在您的示例中,您需要将文件路径绑定到链接按钮的CommandArgument属性。然后,您应该在事件处理程序中使用e.CommandArgument访问路径。
答案 2 :(得分:1)
中继器比类似选项更快,更灵活,因为中继器不添加自己的代码。在某种程度上,它们是一个美化的循环,但我认为使用转发器可能更好,因为它将所有的html代码保存在同一个地方。
答案 3 :(得分:0)
中继器摇滚。特别是包含这种功能的用户控件的转发器。
无论如何,CommandArgument技巧非常有效,特别是如果你只需要一个参数。另一个技巧是将事物连接到单独的处理程序(而不是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中找到过任何关于转发器和一点聪明才智的东西。