dynamic data
DESCRIPTION
Dynamic Dataを使い、各種データコントロールの生産性を十分に引き出すWebアプリの作成方法をご紹介します。TRANSCRIPT
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」
データベースがあれば、とりあえず動くものをみせて、そこでのエラーチェック、表示は徐々に変えていける