DynamicDataなら簡単!
動きを確認しながら作る社内
      Webアプリ


   VSUG フォーラムリーダ
  小野@どっとねっとふぁん
Dynamic Dataの基礎
・利用するテンプレートを選択する
 Dynamic Data Linq to SQL Web Site
 Dynamic Data Linq to SQL Web Application
       (LINQ to SQL を利用する:LinqDataSource)
 Dynamic Data Entities Web Site
 Dynamic Data Entities Web Application
       (Entity Frameworkを利用する:
        EntityDataSource)
・利用するデータモデルを追加する
 LINQ to SQLクラス
 ADO.NET Entity Data Model
・Global.asaxの設定
 DataContextの設定とScaffoldAllTables
 routes定義の変更
       一覧/詳細/挿入/更新をページ毎に処理
       一覧/詳細/挿入/更新を1つのページ内で処理
Dynamic Dataの基礎終わり!
   Routingから対象テーブル名、ページテン
    プレートを取得
   ページに用意されたコントロール群が
    データを適切に表示
       DynamicDataManager、LinqDataSource、
        GirdView 等
   個々の値の表示はフィールドテンプレー
    ト(ascx:ユーザコントロール)が行う
ページテンプレートに頼らない
 GridView/LinqDataSource/
  DynamicDataManagerを設定
 コードでDynamicDataManagerとGridView
  を連結
 この場合、Routingは必須要素ではない
計算結果項目の追加
   Userのパーシャルクラスを作成し、プロパティを追加

    [ScaffoldColumn(true)] <- DynamicDataの表示対象とする
    [ReadOnly(true)] <- 読み取り専用
    [DisplayFormat(ApplyFormatInEditMode=true, DataFormatString="{0}歳")]
    public int age {
        get {
              int _age = DateTime.Now.Year - birthday.Year;
              if (birthday.AddDays(-1).AddYears(_age) > DateTime.Now)_age--;
              return _age;
        }
    }
削除フラグの非表示
   LinqDataSourceで削除フラグが立っていないデータに絞り込み
       LinqDataSourceではテーブルの全項目を対象としないと追加/更新/削除不可
       絞り込みは特定のデータだけでなく、ほかのコントロール等の値と連携することも可
   MetaDataクラスを作成し、プロパティに属性をつける

[MetadataType(typeof(UserMetaData))]   <-   MetaDataクラス名の指定
public partial class User
{ …

public class UserMetaData <- 通常のクラスでもインナークラスでも可
{
          [ScaffoldColumn(false)] <- DynamicDataの表示対象からはずす
          public object delflg { get; set; }
                    <- 元のクラスのプロパティと名前さえ合っていればよい
}
項目の並べ替え
 DynamicFieldを追加
 項目の表示名を設定
ListViewの利用
 ListView/LinqDataSource/
  DynamicDataManagerを設定
 ListViewの構成時に「動的なデータを有効に
  する」
 データ項目の並び替え/非表示項目の削除
       ItemTemplate
       AlternatingItemTemplate
       InsertItemTemplate
       LayoitTemplate(項目の表示名を設定)
       EditItemTemplate
       SelectedItemTemplate
エラーメッセージの変更
[Required(ErrorMessage="名前を入力してください")]
        <- 必須エラーメッセージ
public object name { get; set; }


[Required(ErrorMessage="生年月日を入力してください")]
public object birthday { get; set; }


   データベースではNUll許容の項目を必須と
    することも可
表示方法の変更
[DisplayFormat(ApplyFormatInEditMode = true,
DataFormatString = "{0:yyyy/MM/dd}")]
public object birthday { get; set; }


   DateTimeを日付のみ表示にするといった
    ことが可
入力文字列の評価
[RegularExpression(
        @"¥w+([-+.']¥w+)*@¥w+([-.]¥w+)*¥.¥w+([-.]¥w+)*",
        ErrorMessage = "メールアドレスとして正しい値を
        入力してください")]
public object mail { get; set; }


   正規表現を用いて入力チェック
値変換エラーのメッセージ変更
   専用のエラーチェック属性クラスを作成する
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field,
AllowMultiple = false)]
sealed public class DateTimeCheckAttribute : ValidationAttribute
{
  public override bool IsValid(object value)
  {
    DateTime dt;
    return DateTime.TryParse((string)value, out dt);
  }
}

[DateTimeCheck(ErrorMessage = "生年月日に日付として正しい値を入力
してください")]
public object birthday { get; set; }
カスタムフィールドテンプレート
[UIHint("ForeignKeyText")]
       <- 利用するフィールドテンプレートを指定
public object Gender { get; set; }

   デフォルトでは項目のタイプから自動で判断
   用意されているフィールドテンプレートをコピーし、
    修正するのが便利
   Type名.ascx、Type名_Edit.ascxが利用される
   存在しないType名を指定するとデフォルトの動作にな
    る
   コードビハインド側のクラス名の修正を忘れずに(こ
    ちらがキー)
エラーのサマリー表示
 ValidationSummaryを追加
 ListViewではValidationGroup="Insert"用の
  ValidationSummaryも必要
 フィールドテンプレート内のValidatorの
  Textに"*"を設定
項目間の関係による入力チェック
 LINQ to SQLクラスではパーシャルメソッドが利用できる
 ValidationExceptionを返す

partial void OnValidate(System.Data.Linq.ChangeAction action)
{
  if (gid == 1 && age < 18)
     throw new ValidationException("男性は18歳以上しか登録できません");
  if (gid == 2 && age < 16)
     throw new ValidationException("女性は16歳以上しか登録できません");
}

 actionの値で、追加/更新/削除それぞれの場合の動作を指定可能
 DynamicValidatorを追加し、ListViewに連結
 ValidationGroup="Insert"用も忘れずに
今日のまとめ
   DataAnnotationの属性一覧
       @ITの記事が参考になる
           DBアプリをコーディングレスで構築する
            「ASP.NET Dynamic Data」


   データベースがあれば、とりあえず動く
    ものをみせて、そこでのエラーチェック、
    表示は徐々に変えていける

Dynamic Data

  • 1.
    DynamicDataなら簡単! 動きを確認しながら作る社内 Webアプリ VSUG フォーラムリーダ 小野@どっとねっとふぁん
  • 2.
  • 3.
    ・利用するテンプレートを選択する  Dynamic DataLinq to SQL Web Site  Dynamic Data Linq to SQL Web Application  (LINQ to SQL を利用する:LinqDataSource)  Dynamic Data Entities Web Site  Dynamic Data Entities Web Application  (Entity Frameworkを利用する: EntityDataSource)
  • 4.
    ・利用するデータモデルを追加する  LINQ toSQLクラス  ADO.NET Entity Data Model
  • 5.
    ・Global.asaxの設定  DataContextの設定とScaffoldAllTables  routes定義の変更  一覧/詳細/挿入/更新をページ毎に処理  一覧/詳細/挿入/更新を1つのページ内で処理
  • 6.
    Dynamic Dataの基礎終わり!  Routingから対象テーブル名、ページテン プレートを取得  ページに用意されたコントロール群が データを適切に表示  DynamicDataManager、LinqDataSource、 GirdView 等  個々の値の表示はフィールドテンプレー ト(ascx:ユーザコントロール)が行う
  • 7.
    ページテンプレートに頼らない  GridView/LinqDataSource/ DynamicDataManagerを設定  コードでDynamicDataManagerとGridView を連結  この場合、Routingは必須要素ではない
  • 8.
    計算結果項目の追加  Userのパーシャルクラスを作成し、プロパティを追加 [ScaffoldColumn(true)] <- DynamicDataの表示対象とする [ReadOnly(true)] <- 読み取り専用 [DisplayFormat(ApplyFormatInEditMode=true, DataFormatString="{0}歳")] public int age { get { int _age = DateTime.Now.Year - birthday.Year; if (birthday.AddDays(-1).AddYears(_age) > DateTime.Now)_age--; return _age; } }
  • 9.
    削除フラグの非表示  LinqDataSourceで削除フラグが立っていないデータに絞り込み  LinqDataSourceではテーブルの全項目を対象としないと追加/更新/削除不可  絞り込みは特定のデータだけでなく、ほかのコントロール等の値と連携することも可  MetaDataクラスを作成し、プロパティに属性をつける [MetadataType(typeof(UserMetaData))] <- MetaDataクラス名の指定 public partial class User { … public class UserMetaData <- 通常のクラスでもインナークラスでも可 { [ScaffoldColumn(false)] <- DynamicDataの表示対象からはずす public object delflg { get; set; } <- 元のクラスのプロパティと名前さえ合っていればよい }
  • 10.
  • 11.
    ListViewの利用  ListView/LinqDataSource/ DynamicDataManagerを設定  ListViewの構成時に「動的なデータを有効に する」  データ項目の並び替え/非表示項目の削除  ItemTemplate  AlternatingItemTemplate  InsertItemTemplate  LayoitTemplate(項目の表示名を設定)  EditItemTemplate  SelectedItemTemplate
  • 12.
    エラーメッセージの変更 [Required(ErrorMessage="名前を入力してください")] <- 必須エラーメッセージ public object name { get; set; } [Required(ErrorMessage="生年月日を入力してください")] public object birthday { get; set; }  データベースではNUll許容の項目を必須と することも可
  • 13.
    表示方法の変更 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString= "{0:yyyy/MM/dd}")] public object birthday { get; set; }  DateTimeを日付のみ表示にするといった ことが可
  • 14.
    入力文字列の評価 [RegularExpression( @"¥w+([-+.']¥w+)*@¥w+([-.]¥w+)*¥.¥w+([-.]¥w+)*", ErrorMessage = "メールアドレスとして正しい値を 入力してください")] public object mail { get; set; }  正規表現を用いて入力チェック
  • 15.
    値変換エラーのメッセージ変更  専用のエラーチェック属性クラスを作成する [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] sealed public class DateTimeCheckAttribute : ValidationAttribute { public override bool IsValid(object value) { DateTime dt; return DateTime.TryParse((string)value, out dt); } } [DateTimeCheck(ErrorMessage = "生年月日に日付として正しい値を入力 してください")] public object birthday { get; set; }
  • 16.
    カスタムフィールドテンプレート [UIHint("ForeignKeyText")] <- 利用するフィールドテンプレートを指定 public object Gender { get; set; }  デフォルトでは項目のタイプから自動で判断  用意されているフィールドテンプレートをコピーし、 修正するのが便利  Type名.ascx、Type名_Edit.ascxが利用される  存在しないType名を指定するとデフォルトの動作にな る  コードビハインド側のクラス名の修正を忘れずに(こ ちらがキー)
  • 17.
    エラーのサマリー表示  ValidationSummaryを追加  ListViewではValidationGroup="Insert"用の ValidationSummaryも必要  フィールドテンプレート内のValidatorの Textに"*"を設定
  • 18.
    項目間の関係による入力チェック  LINQ toSQLクラスではパーシャルメソッドが利用できる  ValidationExceptionを返す partial void OnValidate(System.Data.Linq.ChangeAction action) { if (gid == 1 && age < 18) throw new ValidationException("男性は18歳以上しか登録できません"); if (gid == 2 && age < 16) throw new ValidationException("女性は16歳以上しか登録できません"); }  actionの値で、追加/更新/削除それぞれの場合の動作を指定可能  DynamicValidatorを追加し、ListViewに連結  ValidationGroup="Insert"用も忘れずに
  • 19.
    今日のまとめ  DataAnnotationの属性一覧  @ITの記事が参考になる  DBアプリをコーディングレスで構築する 「ASP.NET Dynamic Data」  データベースがあれば、とりあえず動く ものをみせて、そこでのエラーチェック、 表示は徐々に変えていける