none
DataList内の<%#Eval("xxx")%>について教えてください。 RRS feed

  • 質問

  • お世話になります。

    DataList内でで以下のようにするとParser Error: Server tag was not well formedというエラーになってしまうのですが、

    どこがおかしいのかアドバイスをいただけますでしょうか?

    なお、jpegfilenameにはxxx.jpgというファイル名の文字列がはいっています。

     

    <asp:Image ID="Image1" runat="server" ImageUrl="~/images/'<%#Eval("jpegfilename")%>'"/>

    なお、このようにしても同じです。

    <asp:Image ID="Image1" runat="server" ImageUrl="~/images/<%# DataBinder.Eval(Container.DataItem, "jpegfilename") %>" />

     

    どういう場合にだめなのかわからないのですが以下のようなリンク先に埋め込んだケースだと問題なく動作します。

     

     href='https://japan.xxx.com/japan/test.nsf/<%# Eval("DocNumber") %>/?OpenDocument'

     

    宜しくお願いします。

     

    2008年12月3日 5:46

回答

  • 試していませんが、以下で良いんじゃないかと思います。

     

    ImageUrl='~/images/<%#Eval("jpegfilename")%>'

    2008年12月3日 6:36
    モデレータ
  •  tosaito さんからの引用

    よく違いがわからないのですが、ImageUrl='~/images/<%#Eval("jpegfilename")%>'とするとなぜだめなのでしょうか。

     

    '~/images/<%#Eval("jpegfilename")%>' すべてが文字列として解釈されるからだと思います。

    2008年12月3日 7:30
  • 一言足りませんでした。

     

    ImageUrl はその文字列を UrlEncode するというのも理由だと思います。

     

    2008年12月3日 7:39

すべての返信

  • 試していませんが、以下で良いんじゃないかと思います。

     

    ImageUrl='~/images/<%#Eval("jpegfilename")%>'

    2008年12月3日 6:36
    モデレータ
  •  

    trapemiyaさま

    いつもお世話になります。

     

    ImageUrl='~/images/<%#Eval("jpegfilename")%>'

     

    とするとページエラーは発生しないのですが、画像が表示されずXになり、リンク先プロパティをみるとこうなってしまっています。

     

    http://server/images/%3C%25#Eval(%22jpegfilename%22)%25%3E

     

    jpegfilename の値をファイル名だけではなく"~/images/xxx.jpg"と入れておいて、

     <asp:Image ID="Image1" runat="server" ImageUrl='<%#Eval("jpegfilename")%>'/>

    とするとただしく画像が表示されます。

     

    よく違いがわからないのですが、ImageUrl='~/images/<%#Eval("jpegfilename")%>'とするとなぜだめなのでしょうか。

     

    宜しくお願いします。

     

     

     

    2008年12月3日 7:09
  •  tosaito さんからの引用

    よく違いがわからないのですが、ImageUrl='~/images/<%#Eval("jpegfilename")%>'とするとなぜだめなのでしょうか。

     

    '~/images/<%#Eval("jpegfilename")%>' すべてが文字列として解釈されるからだと思います。

    2008年12月3日 7:30
  • 一言足りませんでした。

     

    ImageUrl はその文字列を UrlEncode するというのも理由だと思います。

     

    2008年12月3日 7:39
  • SurferOnWwwさま

    ありがとうございます。

     

    なるほどよくわかりました。

    だからリンク先では’ ’で囲ってある中にEVALがあってもうまくいってImageUrlではだめなんですね。とりあえず、データベース内のデータをファイル名ではなくパスも含めて記録するようにすることにしました。

     

    ありがとうございました。

     

    2008年12月4日 1:38
  •  tosaito さんからの引用

    ImageUrl='~/images/<%#Eval("jpegfilename")%>'

    ImageUrl='<%# "~/images/" + Eval("jpegfilename") %>'
    2008年12月4日 2:15
  •  tosaito さんからの引用

    とりあえず、データベース内のデータをファイル名ではなくパスも含めて記録するようにすることにしました。

     

    苦渋の選択かもしれませんが、このような設計にするのは、本当に最後の最後、どうしようもない時です。むしろ、してはいけないと言い切っても良いぐらいです。

    アプリケーションを設計する上で、テーブルの設計がアプリケーションの良し悪しに大きく影響します。テーブルをきちんと設計し、その上で、アプリケーション側でもっと解決策をさぐるようにされたら良いと思います。

    2008年12月4日 6:10
    モデレータ
  • 以下のような方法もあります。

     

    (1) メソッドで文字列を組み立て:

     

    string ImageFilePath(string filename)
    {
        return "~/images/" + filename;
    }

     

    それを以下のように設定する:


    <asp:Image ID="Image1" runat="server"
        ImageUrl='<%# ImageFilePath((string)Eval("jpegfilename")) %>' />


    (2) ItemDataBound イベントを利用する(これはあまり使い道はなさそう)

     

    void Item_Bound(Object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item ||
            e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Image image = (Image)e.Item.FindControl("Image1");
            image.ImageUrl = "~/Images/" + (string)((DataRowView)e.Item.DataItem)["jpegfilename"];
        }
    }

     

    今回の場合は karashima さんが示された方法が良いと思いますが、より複雑な

    文字列を組み立てるような場合は (1) の方法も使えると思います。

     

    それより、DB の中に画像データも入れてしまい、そこから取得して表示するという
    方法はいかがですか? レコードごとに異なる画像で、かつ数が多いという場合は
    その方がよさそうです。

    2008年12月4日 13:10