モデルの検証
当然、ほとんどのデータモデルには、検証ルールのタイプがいくつか含まれています。これを促進させるために、Webフォーム上のモデルバインディングシステムは、ASP.NET Dynamic Data、MVC、Entity Framework、Silverlight RIA Servicesが行っているように、System.ComponentModel.DataAnnotations名前空間にある同じ検証属性を使ったモデル検証をサポートしています。それらの属性をモデルクラス上のプロパティに加えることで、値が必要なプロパティや有効な値の範囲などの詳細情報が含まれたモデルの『shape』が提供できるようになります。
データベースのスキーマに合った検証情報でProductクラスを更新しましょう。
これを行うために、Productクラスに次の属性を加えます。
public class Product
{
public int ProductID { get; set; }
[Required, StringLength(40)]
public string ProductName { get; set; }
[StringLength(20)]
public string QuantityPerUnit { get; set; }
[DataType(DataType.Currency)]
public decimal? UnitPrice { get; set; }
public short? UnitsInStock { get; set; }
public short? UnitsOnOrder { get; set; }
public short? ReorderLevel { get; set; }
public bool Discontinued { get; set; }
public int? CategoryID { get; set; }
public virtual Category Category { get; set; }
}
このタイプに値がモデルバインドされたので、Webフォームのモデルバインディングシステムは、ページのModelStateプロパティで、いずれかの検証ルールが違反されていないかどうか追跡を行います。そうすれば、保存する前に、モデルが有効かどうかを明示的に確認できます。
public void UpdateProduct(int productId)
{
var product = _db.Products.Find(productId);
TryUpdateModel(product);
// Check whether there were any validation errors
if (ModelState.IsValid)
{
_db.SaveChanges();
}
}
値が無効な場合にページにモデルのエラーを表示するには、<asp:ValidationSummary>コントロールのShowModelStateErrorsプロパティを『true』に設定して追加します。
<asp:ValidationSummary runat="server" ShowModelStateErrors="true" />
これで無効な値でレコードを更新された場合、GridViewは編集モードのままで、モデルのエラーメッセージが、ValidationSummaryにより表示されます。
検証属性ではカバーされていないようなエラー状態を表示するために、独自または特定のエラーメッセージをそのページのModelStateに追加することも可能です。ASP.NET MVCコントローラと同じように、ページ内の検証コントロールが必要な独自のエラーメッセージを紐づけることのできる『ModelState』プロパティが、WebフォームのPage基本クラスに追加されています。
モデリングバインディングとフィルタリングのQuick Video
Damian Edwards氏は、モデルバインディングによる更新シナリオを実装するため方法を、90秒ビデオで公開しています。それは、ここから見れます。
まとめ
ASP.NET Web Forms 4.5のモデルバインディングシステムでは、コードにフォーカスしたデータアクセスの枠組みを使用しており、データおよびユーザーの入力の扱いが簡単になります。ASP.NET MVCで最初に導入したモデルバインディング概念をいくつか採用し、モデルオブジェクトに検証ビヘイビアを適用するために、MVCおよびWebフォームのどちらにおいてもDataAnnotation属性を使用する統一された方法をサポートしています。ここでお見せするテクニックはすべて、FormView、DetailsView、ListViewを含むASP.NET Webフォームにあるその他のデータコントロールにも同じく適用できます。
Hope this helps,
Scott
P.S. ブログ以外に、Twitterを使って簡単な更新やリンク共有を行っています。私のハンドル名は、@scottguです。

