2009-04-22 11 views
0

ビジネスオブジェクト(プロパティを持つ単純な古いクラス、空想はありません)、空のコンストラクタを作成しました。 /メンバー/作成のための私のビュー(コードを参照)に強いタイプです。クラスに読み書き可能なGUIDとDateTimeプロパティの値が必要です

これはすべて正常に動作し、オブジェクトは「作成ビュー」から「ポストバック」され、メソッドmemberToCreate.Save()は実際に想定されているものをデータベースに書き込みます。

しかし、それが完了すると、作成ビューが再び表示され、読み取り専用のプロパティでない限り、guidおよびdatetime型のフィールドで検証エラー(「値が必要です」)が発生します。

プロパティを他の場所から書き込み可能にする必要があるため、プロパティを読み取り専用に設定する必要はありません。

どうすればこの問題を回避できますか?必要に応じてプロパティを「タグ付け」する/不要にすることはできますか?

' 
' GET: /Member/Create 

Function Create() As ActionResult 
    Return View() 
End Function 

' 
' POST: /Member/Create 

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Create(<Bind(Exclude:="MemberId")> ByVal memberToCreate As Biz.Member) As ActionResult 
    memberToCreate.Save() 
    Return View() 
End Function 

この私に検証エラーを取得:

Public Property DateOfBirth() As Date 
     Get 
      Return _DateOfBirth 
     End Get 
     Set(ByVal value As Date) 
      _DateOfBirth = value 
     End Set 
    End Property 

をこれが...

Public Readonly Property DateOfBirth() As Date 
     Get 
      Return _DateOfBirth 
     End Get 
    End Property 

答えて

2

<Bind(Exclude:="MemberId, DateOfBirth")>にbind属性を変更してみてくださいしません。

また、ビジネスロジックでOKの場合は、DateOfBirthプロパティをnullにすることができます。

+0

あなたのアプローチはどちらも良いもので、何かを教えてくれました。 DateOfBirthを値または何も設定できないようにする必要があります。つまり、バインディングで宣言的に除外することは実行可能なオプションではありません。 私も以前は聞いたことがなかったIsNullableを試しました。かなり興味深いコンセプトですが、実際にビジネスモデルのプロパティを別のタイプに変更したいだけで、検証の問題を回避することはできません。 – Kjensen

+0

うれしい答えがありました。しかし、Nullable(Of Date)型でクラスのDateOfBirthプロパティを宣言したいようです。デフォルトのモデルバインダーにバインドするオプティカルプロパティとして強制的に表示されるので、ポストされたフォームに値が含まれていない場合はnull値が返されます。 –

1

は(新しいキーワードのcagdasはで私を供給して)いくつかのより多くの研究の後、私は、このソリューションに来た:

' 
' POST: /Member/Create 

<AcceptVerbs(HttpVerbs.Post)> _ 
Function Create(<Bind(Exclude:="MemberId,UserId,CreatedBy,ModifiedBy")> ByVal memberToCreate As eForening.Biz.Member) As ActionResult 

    If ModelState.Item("DateOfBirth").Value.AttemptedValue = String.Empty Then 
     ModelState.Item("DateOfBirth").Errors.Clear() 
    End If 

    If Not ModelState.IsValid Then 
     Return View() 
    End If 
    memberToCreate.Save() 
    Return RedirectToAction("Index") 
End Function 

これは私がdateOfBirthのための空と指定された値の両方を処理することができます - と私は私の既存のを維持してみましょうビジネスクラス(それは私の意見であるべきである)。

私は基本的にDateOfBirthの値をチェックし、指定された値が空の文字列の場合は、そのフィールドのエラーカウントをリセットし、Modelstate.IsValidをチェックする前に検証を続行します。

多分もっとエレガントな解決策があるかもしれませんが、これまでに私が見つけた最良の選択肢です。

関連する問題