【问题标题】:Bind Directory.EnumerateFiles to a Repeater using a Generic List使用通用列表将 Directory.EnumerateFiles 绑定到中继器
【发布时间】:2013-01-15 06:43:16
【问题描述】:

我正在尝试创建一个小型网络应用程序,当我输入游戏名称时,它会搜索包含大量图标的文件夹,以找到与输入的游戏相似的图标。

然后我想显示一个带有图标名称的转发器,以及它旁边的图标。

到目前为止,我已经成功地用这个代码显示了名字:

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++)
        {

        }

没有成功。

我知道有一种简单的方法可以做到这一点,但我似乎不能完全正确。有人可以告诉我哪里出错了吗?

【问题讨论】:

  • 你为什么要创建一个AllFiles,它基本上有两次相同的数据?为什么您期望能够将Count() 的结果用作foreach 循环中的源?
  • 不,最后两个只是我在玩这个想法,所以你可以看到我至少在尝试一个解决方案。在我看来,我需要将它放在一个通用列表中,以将名称和路径正确绑定到转发器。不过,我很乐意听到我完全错了。
  • 所以每个条目都应该是{ "foo.png", "c:\Whatever\Bar.path" }?请记住,如果您想提供图片,则需要 URL 而不是文件路径。
  • 我要查找的条目是{ "foo", "/_resources/game_icon/" + "foo.png" }。我需要文件名(不带扩展名 - 因为文件夹中有不同的扩展名)作为文件名,以及带有扩展名的文件名作为图像位置。 Edit 我现在意识到我需要另一个 DirectoryName 变量,因为图像位于子目录中。我正在使用imageresizing.net 来显示我的图像。

标签: c# asp.net repeater generic-list


【解决方案1】:

这是您可以做什么的示例(出于紧凑的原因,我将代码和标记放在单个 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" },
    ...
]

绑定到转发器的正是这个集合。在中继器内部,我们定义了一个 Image,其 ImageUrl 属性将是绑定到我们构造的匿名对象的 Url 属性的数据。

【讨论】:

  • 我喜欢这个的主要一点是你实际上一步一步地解释了这个过程。谢谢你!我看到了你的方法,但我还需要显示文件名,并记住文件在子目录中。
  • 这是我想要的一个惊人的例子,谢谢。我添加的唯一内容是from 中的let filename = Path.GetFileNameWithoutExtension(image)select 中的Filename = filename,。然后&lt;%# Eval("Filename") %&gt; - &lt;%# Eval("Url") %&gt;.aspx。非常感谢。
  • 有点问题 - 页面没有显示带有子目录的文件 URL。例如:而不是/_resources/game_icon/subdir/icon.png,它显示/_resources/game_icon/icon.png
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2016-08-19
相关资源
最近更新 更多