2009-05-28 47 views
4

我对ASP.NET很新,最近我发现了中继器。有些人使用他们,其他人不这样做,我不确定哪种解决方案是最佳做法。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为空(我运行调试器)时,如何获得我想要从此处移除的文件路径。

当我可以使用循环完成同样的事情时,我是否浪费了自己的时间使用中继器,而循环本来就是简单的,可能只是 - 可能优雅吗?

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

回答

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,您可以更快地开发,减少错误。

+1

同上......对生成的HTML的控制是Repeater的巨大好处。 – JasonS 2009-05-28 16:16:10

2

为了显示事物列表,中继器通常比GridViews,DataLists和其他对象更快。中继器最适合显示,而不是添加和编辑记录,尽管您可以手动连接使用Repeater进行CRUD操作所需的内容。

在您的示例中,您需要将文件路径绑定到链接按钮的CommandArgument属性。然后,您应该可以在事件处理程序中使用e.CommandArgument访问路径。

1

中继器比类似的选项更快,更灵活,因为中继器不添加自己的代码。在某种程度上,他们是一个荣耀的循环,但我认为使用中继器可能更好,因为它将所有的html代码保存在同一个地方。

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中发现过任何东西,但用一个转发器和一点聪明才智却无法做到。