方法: データを検証する
検証規則をエンティティまたはテービルに適用して、正しく書式設定されたデータがデータ ソースに書き込まれるようにできます。検証規則は、アプリケーション内のデータが従う必要のある条件または制約です。LightSwitch では、1 つ以上の検証規則をエンティティまたはテーブルに追加できます。ユーザーがデータを追加または変更し、そのデータが検証規則に準拠していない場合、LightSwitch はエラーを表示します。ユーザーがデータをコミットする前に、検証エラーを修正する必要があります。
次の図では、検証エラー メッセージを示しています。
LightSwitch には、いくつかの組み込み検証規則が含まれています。これらの規則を構成し、コードを記述せずにエンティティまたはテーブルに適用できます。コードを使用して、カスタム検証規則を定義することもできます。
このトピックは、次のセクションで構成されています。
定義済みの検証規則をフィールドに適用する
カスタム検証規則をフィールドに適用します。
カスタム検証規則を画面のデータに適用する
データを保存すると実行される検証規則を適用する
関連のビデオ デモについては、「操作方法: LightSwitch アプリケーションで検証および計算フィールドのビジネス ルールを記述する」を参照してください。
定義済みの検証規則をフィールドに適用する
LightSwitch には、カスタム コードを記述せずに使用できるいくつかの組み込み検証規則が含まれます。これらの規則は、データの個別のフィールド、またはユーザーが画面のデータに対して行う任意の更新に適用できます。
定義済みの検証規則をフィールドに適用するには
ソリューション エクスプローラーで、検証規則を適用するエンティティまたはテーブルをダブルクリックします。
エンティティまたはテーブルがデータ デザイナーで開きます。
データ デザイナーで、検証するフィールドを選択します。
[プロパティ] ウィンドウの [検証] セクションで、任意のプロパティの値を設定します。
検証プロパティの詳細については、「リファレンス: データ デザイナーのプロパティ」を参照してください。
カスタム検証規則をフィールドに適用します。
コードを記述して、カスタム検証規則を定義することができます。LightSwitch がこれらの検証規則をいつ適用するか指定できます。たとえば、ユーザーが入力したすぐ後にフィールドの入力規則が適用されるよう指定できます。また、エンティティまたはテーブルのすべてのフィールドに値が入ってから評価するよう指定できます。このモデルは、同じエンティティまたはテーブル内で、1 つのフィールドの値の有効性が別のフィールドの有効な値に依存する場合にメリットがあります。
カスタム検証規則をフィールドに適用するには
ソリューション エクスプローラーで、検証規則を適用するエンティティまたはテーブルをダブルクリックします。
エンティティまたはテーブルがデータ デザイナーで開きます。
データ デザイナーで、検証するフィールドを選択します。
[プロパティ] ウィンドウで、[カスタム検証] をクリックします。
コード エディターが開き、FieldName[_Validate] というメソッドを生成します。
FieldName[_Validate] メソッドに検証コードを追加します。
ユーザーがフィールド値を提供した直後に検証規則を適用するには、results パラメーターの AddPropertyError メソッドを呼び出します。
次の例では、ユーザーが Order エンティティの ShippedDate フィールドに今日よりも後の日付を設定すると、検証メッセージが表示されます。
Private Sub ShippedDate_Validate(results As EntityValidationResultsBuilder) If Me.ShippedDate > DateTime.Today Then results.AddPropertyError _ ("Shipped date cannot be later than today") End If End Sub
partial void ShippedDate_Validate(EntityValidationResultsBuilder results) { if (this.ShippedDate > DateTime.Today) { results.AddPropertyError("Shipped date cannot be later than today"); } }
検証のためにその他のプロパティを強調表示することができます。たとえば、ユーザーが顧客の郵便番号コードを変更すると実行される検証コードを記述できます。City プロパティをパラメーターとして AddPropertyError メソッドに渡す場合は、LightSwitch は City フィールドを強調表示します。検証エラー メッセージ テキストでは、新しい郵便番号に一致する都市の名前を入力するよう促すことができます。
[!メモ]
既定では、更新は検証規則に準拠するまで、データ ソースにコミットできません。ユーザーが未評価の更新をコミットできるようにするには、AddPropertyError メソッドの代わりに AddPropertyResult メソッドを使用します。AddPropertyResult メソッドの 2 番目のパラメーターについては、ValidationSeverity.Informational または ValidationSeverity.Warning を渡します。
たとえば、別のフィールドの有効な値に依存するフィールドの値をユーザーが変更する場合など、エンティティまたはテーブルに検証規則を適用するには、results パラメーターの AddEntityError メソッドを呼び出します。次の例は、RequiredDate フィールドの値を OrderDate フィールドの値と比較しています。注文日が必要な日付よりも後の場合は、このコードは検証エラー メッセージを表示します。
Private Sub RequiredDate_Validate(results As EntityValidationResultsBuilder) If Me.RequiredDate < Me.OrderDate Then results.AddEntityError _ ("Required data cannot be earlier than the order date") End If End Sub
partial void RequiredDate_Validate(EntityValidationResultsBuilder results) { if (this.RequiredDate < this.OrderDate) { results.AddEntityError ("Required data cannot be earlier than the order date"); } }
カスタム検証規則を画面のデータに適用する
画面コード ファイルで、<エンティティ名またはテーブル名>[_Validate] メソッドにカスタム コードを追加することによって、画面全体に適用されるカスタム検証規則を指定することができます。カスタム コードは、ユーザーが画面のいずれかのデータを変更すると実行されます (たとえば、データを追加または削除する)。データを保存する前にこれらのルールが実行されます。
カスタム検証規則を画面のデータに適用するには
ソリューション エクスプローラーで、検証規則を指定するテーブルをダブルクリックします。
画面デザイナーの上部で [コードの記述] をクリックします。
コード エディターが開きます。
[宣言] メニューで <エンティティ名またはテーブル名>[_Validate] を選択します。
<エンティティ名またはテーブル名>[_Validate] という名前のコード ブロックがコード ファイルに表示されます。
<エンティティ名またはテーブル名>[_Validate] メソッドに、カスタム検証コードを追加します。
ユーザーがデータ行を追加、削除、または更新した後に検証ルールを適用するには、results パラメーターの AddScreenError メソッドを呼び出します。
次の例では、米国の顧客を削除できないようにします。
Private Sub Customers_Validate _ (results As Microsoft.LightSwitch.Framework.Client.ScreenValidationResultsBuilder) If Me.DataWorkspace.NorthwindData.Details.HasChanges Then Dim changeSet As EntityChangeSet = _ Me.DataWorkspace.NorthwindData.Details.GetChanges() Dim entity As IEntityObject For Each entity In changeSet.DeletedEntities.OfType(Of Customer)() Dim cust As Customer = CType(entity, Customer) If cust.Country = "USA" Then entity.Details.DiscardChanges() results.AddScreenResult("Unable to remove this customer." & _ "Cannot delete customers that are located in the USA.", _ ValidationSeverity.Informational) End If Next End If End Sub
partial void Customers_Validate(ScreenValidationResultsBuilder results) { if (this.DataWorkspace.NorthwindData.Details.HasChanges) { EntityChangeSet changeSet = this.DataWorkspace.NorthwindData.Details.GetChanges(); foreach (IEntityObject entity in changeSet.DeletedEntities.OfType<Customer>()) { Customer cust = (Customer)entity; if (cust.Country == "USA") { entity.Details.DiscardChanges(); results.AddScreenResult("Unable to remove this customer. " + "Cannot delete customers that are located in the USA.", ValidationSeverity.Informational); } } } }
[!メモ]
既定では、更新は検証規則に準拠するまで、データ ソースにコミットできません。ユーザーが未評価の更新をコミットできるようにするには、AddScreenError メソッドの代わりに AddScreenResult メソッドを使用します。AddScreenResult メソッドの 2 番目のパラメーターについては、ValidationSeverity.Informational または ValidationSeverity.Warning を渡します。
データを保存すると実行される検証規則を適用する
カスタム検証規則は、ユーザーがデータを保存するとき、またはコードがデータ ソースの SaveChanges メソッドを呼び出すときに適用できます。この種類の検証はサーバー層でのみ実行されます。
データを保存すると実行される検証規則を適用するには
ソリューション エクスプローラーで、検証規則を適用するエンティティまたはテーブルをダブルクリックします。
データ デザイナーのコマンド バーで、[コードの記述] の横の矢印をクリックし、[エンティティ名またはテーブル名][_Validate] をクリックします。
コード エディターが開き、エンティティ名またはテーブル名[_Validate] というメソッドを生成します。
エンティティ名またはテーブル名[_Validate] メソッドに、カスタム検証コードを追加します。
results パラメーターの AddEntityError メソッドを呼び出します。
次の例では、ユーザーが販売注文を保存すると、顧客の信用状況をチェックします。顧客のクレジットが金融部門によって承認されていない場合は、ValidationException がスローされます。
Private Sub Orders_Validate _ (entity As Order, results As _ Microsoft.LightSwitch.EntitySetValidationResultsBuilder) If Not CustomerCreditApproval(entity.Customer) Then results.AddEntityError("Customer Credit has not yet been approved") End If End Sub Private Function CustomerCreditApproval(ByVal entity As Customer) As Boolean 'Some custom code to check the customer’s credit status. Return True End Function
partial void Orders_Validate (Order entity, EntitySetValidationResultsBuilder results) { if (!CustomerCreditApproval(entity.Customer)) { results.AddEntityError ("Customer Credit has not yet been approved"); } } private bool CustomerCreditApproval(Customer entity) { //Some custom code to check the customer's credit status. return true; }
[!メモ]
既定では、例外がスローされると、エラー メッセージが表示され、データは現在の変更セットに残ります。この動作を変更する場合は、コードで ValidationException を処理できます。