1

小さな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++)
        {

        }

成功しませんでした。

これを行うための単純な方法があることは知っていますが、私はそれを正しく理解できないようです。誰かが私がどこで間違っているのか教えてもらえますか?

4

1 に答える 1

3

これができることの例です (コンパクトにするために、コード ビハインドとマークアップを 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>

よし、テキスト フィールド、ボタン、リピーターを含む Web ページができました。ボタンをクリックすると、指定されたフォルダー内で、テキスト フィールドに入力されたテキストを名前に含むすべての画像が検索されます。

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

したがって、1 日の終わりには、画像コレクションは次のようになります (ユーザーimageがテキスト フィールドで検索したと仮定します)。

[
    { Url: "/_resources/game_icon/image1.png" },
    { Url: "/_resources/game_icon/subfolder1/image2.png" },
    { Url: "/_resources/game_icon/subfolder2/image1.png" },
    ...
]

リピーターにバインドされているのはこのコレクションです。リピーター内で、構築した無名オブジェクトImageUrlのプロパティにデータ バインドされたプロパティを持つ Image を定義しました。Url

于 2013-01-15T06:53:40.673 に答える