绑定Directory.EnumerateFiles到中继器使用泛型列表(Bind Director

2019-09-26 16:44发布

我试图创建一个小的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++)
        {

        }

没有成功。

我知道有一个简单的方法来做到这一点,但我不能挺似乎得到它的权利。 可能有人请告诉我,我要去哪里错了吗?

Answer 1:

以下是你可以做一个例子(用于紧凑的原因我已经把后面的代码和标记单个Web窗体中,但当然你可以在一个单独的文件后面的代码):

<%@ 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构建了匿名对象的属性。



文章来源: Bind Directory.EnumerateFiles to a Repeater using a Generic List