SHOEISHA iD

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

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

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

japan.internet.com翻訳記事

ASP.NET Dynamic Dataでデータベースのユーザーインターフェイス作成を簡単に

データベース編集用のWebベースのインターフェースを短時間で作成

データベース値の検証

 ASP.NET Dynamic Dataを使えばデータベース編集用のシンプルなユーザーインターフェースを作成するのはごく簡単な作業になりますが、それでもやはり、大抵のアプリケーションではビジネスルールを作成してデータ入力を制御するという工程が必要です。もし可能であれば、そのための手だてはデータベースレベルから始めるのが最善の策です。例えば、必須のフィールドであれば、SQL Server内でそのように定義すべきです。あるいは、0~100の値しか受けつけないフィールドであれば、CHECKキーワードか、SQL Server Management Studioの[CHECK制約]ダイアログボックスを使って、フィールドに制約条件を直接追加すべきです。

 ASP.NET Dynamic Dataアプリケーションでは、データベースレベルの制約の一部は自動的に適用されます。例えば必須フィールド(NOT NULL)の場合、実行時には、空白のままのときに自動的に検証エラーが発生します。しかし、モデルに反映されないもっと複雑な制約条件(CHECK制約など)の場合には、更新に失敗したという一般的なエラーとなってしまいます。どこに不備があるかをユーザーに明確に伝えたい場合には、ここでも属性を使用できます。

 例えば、Range属性(System.ComponentModel.DataAnnotations名前空間で定義)を使用すると、整数または浮動小数点数のフィールドの最小値と最大値を指定できます。指定の仕方はScaffoldColumn属性やUIHint属性と同様です。

 このほか、値のチェックに使用できる属性には、Required属性やRegularExpression属性があります。また、文字列の長さを制限できるStringLength属性もあります。一方、独自の検証コードを使用したい場合は、データモデルを拡張するメソッドを記述するという方法があります。例えば、ADO.NET Entitiesを使用している場合、フィールドを検証するためのパーシャルメソッド宣言がNorthwindModel.Designer.csファイルにあります。

 例えば、従業員の入社日は必ず月曜日だというビジネスルールがある場合は、EmployeesクラスのOnHireDateChangingメソッドにコードを実装します。目的の処理は次のようなコードで実現できます。

public partial class Employees
{
  partial void OnHireDateChanging(System.DateTime? value)
  {
    if (value.HasValue)
    {
      if (value.Value.DayOfWeek != DayOfWeek.Monday)
      {
        throw new Exception(
          "The hire date must be a Monday");
      }
    }
  }
}

 しかし、この方法には1つ問題があります。OnChangingイベントはたびたび発生するイベントで、レコードの表示、編集、保存をするたびに発生するのです。このため、データベースの実際の値は必ず規則を満たしていなくてはなりません。規則を満たしていない場合はデータを表示できません。

 代わりに、データベースに変更を保存するときにのみ値を検証したい場合には、もう少しコードを記述する必要があります。エンティティデータモデルクラス(このサンプルアプリケーションではNorthwindEntities)にはSavingChangesというイベントがあり、その中で処理を実行できます。検証規則のコードをこのイベントハンドラに記述します。

using System.Data;
using System.Data.Objects;
...
public partial class NorthwindEntities
{
  partial void OnContextCreated()
  {
    this.SavingChanges
      += new EventHandler(MyHandlerForSavingChanges);
  }

  internal void MyHandlerForSavingChanges(
  object sender, EventArgs e)
  {
    IEnumerable<ObjectStateEntry> changedEntities =
      this.ObjectStateManager.
      GetObjectStateEntries(EntityState.Added |
      EntityState.Modified);
    foreach (ObjectStateEntry entry in changedEntities)
    {
      if (entry.Entity is Employees)
      {
        Employees emp = (Employees)entry.Entity;
        if (emp.HireDate.HasValue)
        {
          if (!(emp.HireDate.Value.DayOfWeek ==
            DayOfWeek.Monday))
          {
            throw new Exception(
              "The hire date must be a Monday");
          }
        }
      }
    }
  }
}

 このコードでは、まずOnContextCreatedパーシャルメソッドを実装し、SavingChangesイベントのイベントハンドラを追加します。イベントハンドラ本体(MyHandlerForSavingChanges内)では、追加または変更された全レコードをデータモデルから取り出し、ループ処理を行って、Employeesテーブルに関係するデータをピックアップします。該当するデータの場合は、HireDateフィールドの値をチェックし、月曜でない場合には例外を発生させます。

 独自の検証コードの作成は特に難しいものではありませんが、使わなくても済むケースは多々あります。ASP.NET Dynamic Dataに用意されている属性は汎用性が高いからです。しかし、目的を満たせない場合には、ここで紹介した2つの方法を使って、独自の規則を記述するとよいでしょう。

まとめ

 この記事では、ASP.NET Dynamic Dataを使用して、データベースの実用的なWebフロントエンドを短時間で作成する方法を見てきました。カスタマイズがほぼゼロの状態でも、管理目的程度なら十分使えるWebインターフェースを作成できます。さらに多少の開発を加えれば、多彩なユーザーに適したアプリケーションを効果的に作成できます。しかし、ASP.NET Dynamic Dataアプリケーションがすべてのニーズにぴったり適合するとは限りません。その場合には、ASP.NET Dynamic Dataアプリケーションを既存の標準的なASP.NET WebFormsアプリケーションに簡単に統合できるということも知っておくと役立ちます。さらには、グリッドを使用して、データのインプレース編集機能を有効にすることもできます。それには、Global.asax.csファイルで、10行ほどのコードをコメント化したりコメントから外したりします。具体的な方法については、ファイル内の説明を参照ください。

 ASP.NET Dynamic Dataアプリケーションは、マスターページとCSSのスタイルを利用したユーザーインターフェース用ですので、作成したアプリケーションに変更を加えて、目的に合った外観と操作性を実現することも簡単です。さらに今後、そうしたカスタマイズはいっそう簡単になるはずです。次期バージョンのパブリックプレビュー版はCodePlexにも既に掲載されています。また、.NET Framework 4.0にはASP.NET Dynamic Dataがネイティブに統合されます。こうしたことから、ASP.NET Dynamic Dataの未来は明るいと言えます。現時点でも十分に役立つ機能であり、データベースのインターフェースを短時間で開発したいという多くの人のニーズを満たしています。

参考資料

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

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

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

Jani Jarvinen(Jani Jarvinen)

フィンランドのソフトウェア開発トレーナー兼コンサルタント。Microsoft C# MVPの受賞者で、投稿も多数。ソフトウェア開発に関する著書も3冊出版している。ITpro.fiというフィンランドのソフトウェア開発エキスパートグループのグループリーダー。ブログのアドレスはhttp://www.saunalahti.fi/janij/

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4155 2009/07/29 14:00

イベント

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

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

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

メールバックナンバー