SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

AJAX SlideShowおよびTreeViewコントロールを使用してスライドショーを作成する

データベースの代わりにファイルシステムを使ったスライドショー

Webアプリケーションの作成

 Visual Studioで、AJAX対応Webアプリケーションを新規作成します。

 AjaxControlToolkit.dllを参照としてプロジェクトに追加します。

SlideService.asmxの作成

 SlideService.asmxという名前のWebサービスを追加します。あらかじめ用意されている「Hello World」的な関数を、次のように変更します。

[WebMethod]
public AjaxControlToolkit.Slide[] GetSlides(String contextKey)
{
    return null;
}

 関数名はGetSlidesです。パラメータは、String型のcontextKeyです。contextKeyは、どのような方法でも使用できます。このパラメータは、呼び出し元AJAXコントロールからWebサービスに情報を渡すのに使用します。このアプリケーションでは、このパラメータを使用して、スライドショーのソースディレクトリを指定します。戻り値は、スライドの配列です。AJAX SlideShowコントロールがこのシグネチャを探すときには、シグネチャの大文字と小文字が厳密に区別されます。この構文を変更するとサービスが呼び出されなくなるので、変更しないでください。

 次のキーをWeb.Configに追加します。

<add key="SlideServiceNoImagesFoundLocation" 
     value="NoImagesFound.jpg"/>
<add key="SlideServiceValidImageExtensions" value="jpg,gif,bmp,ico"/>

 1番目のキーでは、contextKeyパラメータで指定されたディレクトリ内に画像が見つからない場合にスライドショーに表示する代替画像のWeb上での位置を設定します(今回の例ではWebサイトのルートにあります)。2番目のキーでは、ディレクトリ内の有効な拡張子のリストを設定します。これらの拡張子を持つ画像がスライド配列で返されます。

 上の例では、「NoImagesFound.jpg」という名前の画像を指定しています。この画像は、この記事のダウンロードファイルに含まれています。アプリケーションには次のように表示されます。

 画像NoImagesFoundを扱う関数は次のとおりです。この関数はGetSlides()から呼び出されます。

private AjaxControlToolkit.Slide[] GetNoImagesFoundDirectory()
{
    AjaxControlToolkit.Slide[] slides = new AjaxControlToolkit.Slide[1];

    // get image from web.config and verify it exists on file system
    _noImagesFoundWebLocation
      = System.Configuration.ConfigurationSettings.AppSettings.Get(
                                "SlideServiceNoImagesFoundLocation");
    if (!File.Exists(Server.MapPath(_noImagesFoundWebLocation)))
       throw new Exception("SlideService.asmx::
        GetNoImagesFoundDirectory - NoImagesFoundLocation found in 
        web.config does not exist after server.mappath - " 
        + Server.MapPath(_noImagesFoundWebLocation));

    // create slide from image
    slides[0] = new AjaxControlToolkit.Slide(
      _noImagesFoundWebLocation, 
      "No Images Found: Please click on another directory", "");

        // return slide
        return (slides);
    }

 このGetNoImagesFoundDirectory関数は、要素を1つだけ持つSlide配列を作成します。この関数は、Web.Configから画像ファイルの場所を取得し、実際にファイルが存在するかどうかを確認します。次に、Slide配列に画像を追加し、別のディレクトリをクリックする必要があることをユーザーに示す見出しを追加します。

 ここでは説明しませんが、この記事のダウンロードパッケージには、IsImage()およびGetImageExtensionsFromWebConfig()という2つの関数もあり、GetSlides()から呼び出されます。

 GetSlides()関数は次のとおりです。

[WebMethod]
public AjaxControlToolkit.Slide[] GetSlides(String contextKey)
{
    // get valid extensions
    GetImageExtensionsFromWebConfig();

    // contextKey not empty
    if (String.IsNullOrEmpty(contextKey))
        return null;

    // contextKey in scope
    if ((contextKey.IndexOf("..")>=0))
        return null;

    // verify contextKey directory exists
    String mapPath = Server.MapPath(contextKey);
    if (!Directory.Exists(mapPath))
        throw new Exception(
           "SlideService.asmx::GetSlides - mapPath does not exist - "
            + Server.MapPath(mapPath));

    // get files in contextKey directory
    string[] fileNames = System.IO.Directory.GetFiles(mapPath);
    if (fileNames.Length == 0)
        return GetNoImagesFoundDirectory();

    // create generic empty list of slides
    List<AjaxControlToolkit.Slide> list
       = new List<AjaxControlToolkit.Slide>();
    String justFileName;
    String displayedFileTitleOnSlider;
    String displayedFileDescriptionOnSlider;

    for (int i = 0; i < fileNames.Length; i++)
    {
        if(IsImage(Path.GetExtension(fileNames[i])))
        {
            // get complete filename
            justFileName = Path.GetFileName(fileNames[i]);

            // get title
            displayedFileTitleOnSlider
              = Path.GetFileNameWithoutExtension(fileNames[i]);

            // set description to empty
            displayedFileDescriptionOnSlider = String.Empty;

            // add file to list of slides
            list.Add(new AjaxControlToolkit.Slide(contextKey
               + justFileName, displayedFileTitleOnSlider, 
                     displayedFileDescriptionOnSlider));
        }
    }
    return (list.ToArray());
}

 このGetSlides()関数は、Web.Configから有効なファイル拡張子を取得し、contextKeyが空でないことを確認し、安全性を確保するために、contextKeyがこのアプリケーションのスコープ内にあることを確認します。

 次に、Server.MapPathを利用してcontextKeyをWeb上での位置からディスク上の物理的な位置に変換し、それが実際に存在するかどうかを確認します。その後、該当ディレクトリ内のファイルの名前をすべて文字列配列に取り込みます。

 この文字列配列にファイル名が1つも含まれていない場合は、GetNoImagesFoundDirectory()関数を利用して画像NoImagesFoundを返します。次に、この関数は、ジェネリック型を利用して空のスライドリストを作成します。その後、ファイル名を反復処理して、有効な拡張子を検索します。有効な拡張子を持つファイル名は、スライド配列に追加していきます。ファイル名から拡張子を除いた部分を、スライドショー画像のタイトルにします。スライドショー画像の説明は空白にします。

 続いて、次のクラス変数を追加します。

String _noImagesFoundWebLocation; //path and file of the image 
                                  //containing "No Images Found" text
String _arrayOfImageExtensions; //string of valid image file 
                                //extensions without "." in the 
                                //value ex "jpg,gif"
String[] _extensionList; //string array of valid image file extensions
                         // without "." and with comma removed

 次の参照を追加します。

using System.Web.UI.WebControls;
using System.Diagnostics;
using System.IO;
using System.Configuration;
using System.Collections.Generic;

 GetSlides関数の上部にある宣言に、次の行を追加します。

[System.Web.Script.Services.ScriptService()]

 以上の作業が終了したら、WebサービスページSlideService.asmxを直接呼び出して、このサービスをブラウザでテストします。

 次の形式の結果が得られることを確認します。

<Slide>
    <ImagePath>/images/Blue hills.jpg</ImagePath>
    <Name>Blue hills</Name>
    <Description />
</Slide>

次のページ
注意事項

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Dina Fleet Berry(Dina Fleet Berry)

.NETプログラマ、テクニカルライター。Project 31Aプログラミングブログに寄稿。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2320 2008/03/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー