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 は省略可能。
ところが RequiredArgument 属性での必須チェックは「Null (Nothing) ではない」事のチェックしか行いません。今回のサンプルのように String の場合、空文字列を設定する事で必須チェックを回避する事ができてしまいます。
このような場合、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 メソッドを用いて検証エラーの結果を設定します。
そのようにすることで、上記画面のように空文字列を不許可とする検証を行う事ができます。
0 件のコメント:
コメントを投稿