2

私は複雑なモデルクラスを持っていますが、そのうち少数の文字列だけを編集する必要があります。これらの列を開いて編集してフォームを保存すると、文字列は正常にポストバックされますが、他の(配列)列はnullになります。これにより、Entity Frameworkへの保存が中断されます。MVC3を使用した複雑なモデルへの更新の保存

MVC3とEFでこれを行う適切な方法は何ですか?あなたは、これはあなたがモデルをロードし、他の列に

+0

*他の配列の列の意味はnullですか? –

+0

他のモデルクラス、複雑なオブジェクトまたは正しくシリアライズできないもののいずれかの配列である列は、バックポストされたモデルオブジェクトではすべてnullです。 – ShawnL

+0

これらのモデルをどのようにバインドしますか?あなたのビューとモデル構造の詳細を表示することなく、あなたはほとんど答えを得ることができません。 –

答えて

1

これはよくある問題だと思います。私が使用するアプローチのいくつかがあります:

1)これは私の推奨するアプローチです。編集するプロパティのみを含むビューモデルを使用します。これは、現在行っているように直接バインドすることができます。この方法の問題は、EFオブジェクトとの間でプロパティをコピーする必要があることです。命名規則が一貫していれば、ダム反射複写機を使用することができます。そうでない場合やグラフを歩いて戻す必要がある場合は、そのカスタムロジックをviewmodelクラスに入れてしまう傾向があります。 (それは純粋なビューモデル以上になりますが、ビューモデルやビューにはその存在を認識する必要があります)

2)変更されたバインディングを使用します。 [Bind(Exclude = "this、that、theother")]を指定することで、特定のプロパティをゼロにするのを止めることができます。また、プロパティがスカラープロパティの場合、単にHtml.HiddenFor => x.myprop)

別のアプローチは、

3)カスタムバインダーです。必要に応じて独自のカスタムバインダーとエンジニアを登録することができます。これは私が使ったアプローチではありません。しかしうまくいくかもしれません。

理由は1)は、2)HTML POSTを介して更新するためにモデル全体を公開している2)(IMHO)よりもはるかに良いアプローチです。 MVCバインダーは、何かに変更をバインドするので、よく作られたPOSTは予期せぬことをする可能性があります。一方、ViewModelパターンには、ユーザーが対話するフィールドのみを公開するエンティティが必要です。そのため、バインドするのが安全です。

0

データベースから、TryUpdateModel(yourDbLoadedModel)を呼び出して、フォームの値をモデルにマージします。フォームからいくつかの特定のフィールドだけを含める場合は、このバインドに含めるフィールドまたは除外するフィールドを指定することもできます。これは、存在しないように意図されていないフォームフィールドを注入してモデルをハックすることはできません。主キー値として使用します。

2

を隠すために選んだ理由に応じて、セキュリティ上の問題である可能性がありますけれども、あなたがポストバックから取得モデルが完全になるように、あなたの隠されたフィールドに列のみを読んで結合することができる

関連する問題