我在Web服务器上有文件。我想使它们可供下载到客户端。但是,我不知道文件将是什么,甚至在运行时之前将不知道会有多少个文件。如果我创建了NavigateUrl设置为服务器上文件位置的超链接,则客户端只是尝试在其本地系统上的该位置定位文件,因此不起作用。我可以使用linkbutton来使单个文件工作,但这不是一个选择,因为我无法动态创建它。
有没有办法在ASP.NET中动态地做到这一点?
答案 0 :(得分:1)
我最终解决此问题的方法是使用中继器,然后将操作放入中继器中,而不是放在链接按钮中。
<asp:Repeater id="repLinks" runat="server" OnItemCommand="repLinks_OnItemCommand">
<ItemTemplate>
<li>
<asp:LinkButton ID="HyperLink1" runat="server" Text='<%# Eval("Name") %>' CommandArgument='<%# Eval("Name") %>'>
</asp:LinkButton>
</li>
</ItemTemplate>
</asp:Repeater>
然后显示以下代码:
protected void repLinks_OnItemCommand(object sender, RepeaterCommandEventArgs e)
{
Current.Response.AddHeader("Content-disposition", "attachment; filename=" & fileName)
Current.Response.ContentType = "application/octet-stream"
Current.Response.WriteFile(System.IO.Path.Combine(_path, e.CommandArgument.ToString))
Current.Response.Flush()
Current.Response.[End]()
}
我所缺少的是,对于中继器中的每个LinkButton,我可以具有相同的处理程序,然后只需将文件名作为CommandArgument传递即可。
答案 1 :(得分:0)
我将从服务器读取文件并将其显示在Repeater Control中
//the relative folder path
string folder = "/images";
//read all the files in the folder
DirectoryInfo di = new DirectoryInfo(Server.MapPath(folder));
FileInfo[] files = di.GetFiles().OrderBy(p => p.Name).ToArray();
//bind to a Repeater
Repeater1.DataSource = files;
Repeater1.DataBind();
然后在aspx页面上
<ul>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<li>
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl='<%# "/images/" + Eval("Name") %>'><%# Eval("Name") %>
</asp:HyperLink>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>