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

时间:2009-05-28 16:01:06

标签: c# asp.net repeater

我是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 个答案:

答案 0 :(得分:9)

您可以在显示时正确处理LinkBut​​ton事件。你可以像这样在你的LinkBut​​ton中添加一个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中找到过任何关于转发器和一点聪明才智的东西。