方法: LightSwitch アプリケーションでデータを検証する

エンティティやテーブルに検証規則を適用することで、Visual Studio LightSwitch アプリケーションのデータ ソースに適切で正しいデータを書き込むことができます。 検証規則は、アプリケーション内のデータが従う必要のある条件または制約です。 エンティティやテーブルには、1 つ以上の検証規則を追加できます。ユーザーが規則に反する方法でデータを追加したり変更したりすると、エラー メッセージが表示されます。 ユーザーがデータをコミットする前に、検証エラーを修正する必要があります。

次の図では、検証エラー メッセージを示しています。

検証エラー メッセージ

LightSwitch には、いくつかの検証規則が組み込まれています。 これらの規則を構成し、コードを記述せずにエンティティまたはテーブルに適用できます。 コードを使用して、カスタム検証規則を定義することもできます。

このトピックは、次のセクションで構成されています。

  • 定義済みの検証規則をフィールドに適用する

  • カスタム検証規則をフィールドに適用する

  • カスタム検証規則を画面のデータに適用する

  • データを保存すると実行される検証規則を適用する

ビデオへのリンク 関連するビデオ デモは、「How Do I: Write business rules for validation and calculated fields in a LightSwitch Application? (操作方法: LightSwitch アプリケーションで使用する検証フィールドと計算フィールドのビジネス ルールを記述する).」を参照してください。

定義済みの検証規則をフィールドに適用する

LightSwitch には、カスタム コードを記述せずに使用できる検証規則が組み込まれています。 これらの規則は、データの個別のフィールド、またはユーザーが画面のデータに対して行う任意の更新に適用できます。

定義済みの検証規則をフィールドに適用するには

  1. ソリューション エクスプローラーで、検証規則を適用するエンティティまたはテーブルのショートカット メニューを表示し、[開く] を選択します。

    エンティティまたはテーブルがデータ デザイナーで開きます。

  2. データ デザイナーで、検証するフィールドを選択します。

    注意

    アプリケーションを Visual Studio 2012 更新プログラム 2 にアップグレードしている場合、パースペクティブ バーのボタンを使用して、検証を実行する層を選択することもできます。

  3. [プロパティ] ウィンドウの [検証] セクションで、任意のプロパティの値を設定します。

    検証プロパティの詳細については、「リファレンス: データ デザイナーのプロパティ」を参照してください。

カスタム検証規則をフィールドに適用する

コードを記述してカスタム検証規則を定義し、それらを適応するタイミングを指定できます。 たとえば、ユーザーがフィールドに値を入力した直後に検証を実施するよう指定できます。 また、すべてのフィールドに値が入力された時点で、エンティティやテーブルを評価するよう指定することもできます。 このモデルは、同じエンティティまたはテーブル内で、1 つのフィールドの値の有効性が別のフィールドの有効な値に依存する場合にメリットがあります。

カスタム検証規則をフィールドに適用するには

  1. ソリューション エクスプローラーで、検証規則を適用するエンティティまたはテーブルのショートカット メニューを表示し、[開く] を選択します。

    エンティティまたはテーブルがデータ デザイナーで開きます。

  2. データ デザイナーで、検証するフィールドを選択します。

  3. [プロパティ] ウィンドウで、[カスタム検証] リンクを選択します。

    コード エディターが開き、FieldName_Validate という名前のメソッドが生成されます。

  4. 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 メソッドに渡した場合、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"); 
        }
    
    }
    

カスタム検証規則を画面のデータに適用する

画面全体に適用されるカスタム検証規則を指定するには、画面コード ファイルで、EntityOrTableName_Validate メソッドにカスタム コードを追加します。 ユーザーが画面上のデータを変更すると (追加や削除など)、追加したカスタム コードが実行されます。 データを保存する前にこれらのルールが実行されます。

カスタム検証規則を画面のデータに適用するには

  1. ソリューション エクスプローラーで、検証規則を指定する画面のショートカット メニューを表示し、[開く] を選択します。

  2. 画面デザイナーの上部にある [コードの記述] をクリックします。

    コード エディターが開きます。

  3. [宣言] の一覧で EntityOrTableNameProperty _Validate を選択します。

    EntityOrTableNameProperty_Validate という名前のコード ブロックがコード ファイルに表示されます。

  4. カスタム検証コードを EntityOrTableNameProperty_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 メソッドを呼び出すときに適用できます。 この種類の検証はサーバー層でのみ実行されます。

データを保存すると実行される検証規則を適用するには

  1. ソリューション エクスプローラーで、検証規則を適用するエンティティまたはテーブルのショートカット メニューを表示し、[開く] を選択します。

    注意

    Visual Studio 2012 更新プログラム 2 にアップグレードしたアプリケーションでは、パースペクティブ バーで [サーバー] タブを選択します。

  2. データ デザイナーのコマンド バーで、[コードの記述] の一覧から EntityOrTableName_Validate を選択します。

    コード エディターが開き、EntityOrTableName_Validate という名前のメソッドが生成されます。

  3. カスタム検証コードを EntityOrTableName_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 を処理できます。

参照

処理手順

方法: データ イベントを処理する

方法: LightSwitch データベースのデータ フィールドを定義する

概念

コードを使用したデータ関連タスクの実行

コードでのデータ関連オブジェクトの操作

その他の技術情報

Overview of Data Validation in LightSwitch Applications (LightSwitch アプリケーションでのデータ検証の概要)

データ: アプリケーションの背景情報