ASP.NET MVC Tip #4 - Create a Custom Data Controller Base Class - Stephen Walther on ASP.NET MVC

でもね、GetDynamicGetがカッコよすぎる。
IdentityColumnNameも主キーがintの項目を1つにするルールを貫けば(Railsとかそうだし)超絶便利な予感。
派生してるのがHomeControllerだからリソース名がHomeに思えるけど、そこはデフォルトのままいじってないってことなんだろうから気にしない。実際にはこのサンプルならMoviesControllerとかにするのがナウなヤングのRails風?

RESTfulじゃないけど「設定より規約」なところがいいっす!
最近のお気に入りはDBのテーブル全てにEntryDateとModifyDateをDateTime型で作っておいて、DataContextクラスのSubmitChangesをオーバーライドして勝手に値を入れるようにすること。

    public override void SubmitChanges(ConflictMode failureMode)
    {
      ChangeSet changes = this.GetChangeSet();
      DateTime now = DateTime.Now;
      Action<object, string> setNow = (entity, name) => {
        var etype = entity.GetType();
        var prop = etype.GetProperty(name);
        if (prop != null)
          prop.SetValue(entity, now, null);
      };

      // insert
      foreach (var entity in changes.Inserts)
      {
        setNow(entity, "EntryDate");
        setNow(entity, "ModifyDate");
      }

      // update
      foreach (var entity in changes.Updates)
      {
        setNow(entity, "ModifyDate");
      }

      base.SubmitChanges(failureMode);
    }

GetChangeSet()で追加・更新・削除それぞれの対象レコードを取得できるから、それを取り出して自動更新。エンティティの型は宣言しないでvarで。varと規約ベースの開発は最高っす!

ただ悩みもありまして...。
入力値の検証(Validation)をどこでやるのがいいのかってことなんですけどね、LINQ to SQLのEntityのpartial classでやると、確実にチェックではじけていいんだけど、タイミング的にはもう少し早い段階でやりたかったりする。ViewDataクラスにバリデーション機能をつけるのがいいのかな...。アプリケーションの制約と、データベースの制約とレイヤーが違うからそれぞれに必要なんだろうけど(例えばAとBっていうカラムがあって、更新するときにどっちも空は嫌だけど、どっちも空でもDBでは問題なしとか)。

タイムリーに
オノさんところで紹介されてたサンプル(SingingEels : ASP.NET MVC in the Real World)を見てみたけど、普通にコントローラでForm値を検証してるじゃんよ...。
こんな感じなのかな~(とりあえずTempDataに入れちゃうとロードバランサとかで無茶ぶりできなくなる)。

追記なんですけど。
ASP.NET MVC Tip #5 – Create Shared Views - Stephen Walther on ASP.NET MVC

これまた面白いのが...。Tip #4の続きで今度はまさにDynamic Data。
コントローラ用のViewフォルダに、コントローラでView()するASPXがない場合の初期動作として、Sharedフォルダ使う動きをうまく生かして、すべてに共通のViewでページ生成。なので、インターフェイスを動的に作る必要があるからASPXのコードビハインドにコード書いてる。
全然気になんない!Scaffold!