绑定目录.使用泛型列表将文件枚举到中继器
本文关键字:文件 枚举 中继器 列表 泛型 绑定 | 更新日期: 2023-09-27 17:53:02
我正在尝试创建一个小的web应用程序,当我输入一个游戏名称时,它会搜索一个有很多图标的文件夹,以找到一个类似于输入游戏的图标。
然后我想显示一个带有图标名称的中继器,以及它旁边的图标。
到目前为止,我已经成功地用以下代码显示了名称:IEnumerable<string> getfiles =
from f in
Directory.EnumerateFiles(Server.MapPath("~/_resources/game_icon"), "*.*", SearchOption.AllDirectories)
where Path.GetFileName(f).ToLower().Contains(txtGameName.Text.ToLower())
select Path.GetFileNameWithoutExtension(f);
List<AllFiles> all = getfiles.Select(file => new AllFiles
{
FileName = file,
SubdirectoryName = "",
FileNameWithExtension = ""
}).ToList();
rptGameMatches.DataSource = all;
rptGameMatches.DataBind();
但是我没有很幸运地显示图标,它应该在ImageLocation
中。
我试着玩:
foreach (string file in Directory.EnumerateFiles(Server.MapPath("~/_resources/game_icon"), "*.*", SearchOption.AllDirectories).Count() )
{
if(file.)
}
和
for (int i = 0; i < Directory.EnumerateFiles(Server.MapPath("~/_resources/game_icon"), "*.*", SearchOption.AllDirectories).Count(); i++)
{
}
没有成功。
我知道有一种简单的方法来做这件事,但我似乎不能把它做好。谁能告诉我哪里做错了吗?这里有一个例子,你可以这样做(为了紧凑的原因,我把后面的代码和标记放在一个单独的WebForm中,但当然你可以把后面的代码放在一个单独的文件中):
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<script type="text/c#" runat="server">
protected void BtnSearchClick(object sender, EventArgs e)
{
var images =
from image in Directory.EnumerateFiles(Server.MapPath(folder), "*.*", SearchOption.AllDirectories)
let relativeLocation = image.Replace(root, string.Empty).Replace("''", "/")
let url = ResolveUrl("~/" + relativeLocation)
where image.ToLower().Contains(txtGameName.Text.ToLower())
select new
{
Url = url
};
results.DataSource = images;
results.DataBind();
}
</script>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="txtGameName" runat="server" />
<asp:LinkButton ID="btnSearch" runat="server" OnClick="BtnSearchClick" Text="Search" />
<asp:Repeater ID="results" runat="server">
<ItemTemplate>
<asp:Image runat="server" ImageUrl='<%# Eval("Url") %>' />
</ItemTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
好了,我们有一个网页包含一个文本框,一个按钮和一个中继器。当按钮被点击时,我们将在指定文件夹中搜索所有图像,其名称包含输入文本字段的文本:
var images =
from image in Directory.EnumerateFiles(Server.MapPath(folder), "*.*", SearchOption.AllDirectories)
let relativeLocation = image.Replace(root, string.Empty).Replace("''", "/")
let url = ResolveUrl("~/" + relativeLocation)
where image.ToLower().Contains(txtGameName.Text.ToLower())
select new
{
Url = url
};
这里有几个步骤:
let filename = Path.GetFileName(image)
在这个阶段,我们得到的是文件的物理位置。它看起来像这样:
c:'inetpub'wwwroot'_resources'game_icon'image1.png
然后我们剥离应用程序根并替换斜杠:
let relativeLocation = filename.Replace(root, string.Empty).Replace("''", "/")
所以relativeLocation
变成:
_resources/game_icon/image1.png
,最后一步是:
let url = ResolveUrl("~/" + relativeLocation)
会变成:
/_resources/game_icon/image1.png
所以在一天结束时,图像集合可能看起来像这样(假设用户在文本字段中搜索image
):
[
{ Url: "/_resources/game_icon/image1.png" },
{ Url: "/_resources/game_icon/subfolder1/image2.png" },
{ Url: "/_resources/game_icon/subfolder2/image1.png" },
...
]
就是这个集合绑定到中继器。在中继器中,我们定义了一个图像,它的ImageUrl
属性将被数据绑定到我们构建的匿名对象的Url
属性上。