2011年10月31日月曜日

アクティビティの検証(1)

WF ではアクティビティの検証を行う方法が複数用意されています。単純に必須項目とするだけであれば、RequiredArgument 属性を利用する事だけで可能ですし、OverloadGroup 属性と組み合わせて必須項目グループを形成する事も可能です。

   1: <RequiredArgument()>
   2: <OverloadGroup("GRP1")>
   3: Public Property ReqValue1 As InArgument(Of String)
   4: <RequiredArgument()>
   5: <OverloadGroup("GRP1")>
   6: <OverloadGroup("GRP2")>
   7: Public Property ReqValue2 As InArgument(Of String)
   8: <RequiredArgument()>
   9: <OverloadGroup("GRP2")>
  10: Public Property ReqValue3 As InArgument(Of String)
上記のような属性指定を行うと、次のように動作します。


  • ReqValue1 と ReqValue2 を同時に指定する必要がある。その際 ReqValue3 は省略可能。
  • ReqValue2 と ReqValue3 を同時に指定する必要がある。その際 ReqValue1 は省略可能。


Require1


ところが RequiredArgument 属性での必須チェックは「Null (Nothing) ではない」事のチェックしか行いません。今回のサンプルのように String の場合、空文字列を設定する事で必須チェックを回避する事ができてしまいます。


Require2


このような場合、CacheMetadata メソッドにて検証を行う事で対応します。


   1: Protected Overrides Sub CacheMetadata(metadata As System.Activities.CodeActivityMetadata)
   2:     MyBase.CacheMetadata(metadata)
   3:  
   4:     'プロパティのチェック
   5:     If (ReqValue1 IsNot Nothing) AndAlso (ReqValue2 IsNot Nothing) Then
   6:         Dim req1 = TryCast(ReqValue1.Expression, Literal(Of String))
   7:         Dim req2 = TryCast(ReqValue2.Expression, Literal(Of String))
   8:         If req1 IsNot Nothing Then
   9:             Dim val1 = req1.Value
  10:             If val1.Trim = "" Then metadata.AddValidationError("ReqValue1 に空文字列は利用できません")
  11:         End If
  12:         If req2 IsNot Nothing Then
  13:             Dim val2 = req2.Value
  14:             If val2.Trim = "" Then metadata.AddValidationError("ReqValue2 に空文字列は利用できません")
  15:         End If
  16:     End If
  17:  
  18: End Sub


この場合に注意するのが、InArgument や OutArgument にて指定されているプロパティの場合です。この場合は単純に参照するのではなく、設定された式を取得して、さらに値を取得するという手順を踏む必要があります。そして検証してエラーが確認できた際には、AddValidationError メソッドを用いて検証エラーの結果を設定します。


Require3


そのようにすることで、上記画面のように空文字列を不許可とする検証を行う事ができます。

0 件のコメント:

コメントを投稿