0

とりわけ、フィールドを持つエンティティがあります: CreatedByCreatedAtChangedAt

ビューでは、ユーザーがこれらのフィールドに入力する必要はありません。ModelState.IsValid私のアプローチは、チェックが行われる前、およびデータをデータベースに保存する前に、HTTP POST アクションでそれらを埋めることでした。

ただし、ModelState.IsValid何があってもfalseを返し続けます。これを実装する正しい方法は何ですか? ModelState.IsValidPOST アクションから検証 ( ) を取得する必要がありますか?

4

3 に答える 3

3

1 つの問題、多くの解決策 (私の意見では、最良のものから最悪のものまで)。

最初の解決策

最良の方法は、ViewModel (ユーザーが編集および/または検証する必要があるフィールドのみを含むクラス) を使用することです。

この場合、CreatedBy、CreatedAt、ChangedAt フィールドは ViewModel クラスに表示されません。

2 番目の解決策

ViewModel が必要ない場合は、「ユーザーが変更できない」フィールドを非表示フィールドとしてビューに配置できます。

@Html.HiddenFor(m => m.CreatedAt)

もちろん、隠しフィールドはユーザーが変更できるため、不要なデータへの扉は常に開かれています...

3番目の解決策

有効かどうかを確認する前に、望ましくないエラーを取り除きModelStateます (関係するフィールドが多数ある場合は、非常に退屈になるはずです)。

if (ModelState.ContainsKey("CreatedAt")) {
  ModelState["CreatedAt"].Errors.Clear();
}

//then test for ModelState.IsValid()

その他のソリューション

ホワイトリスト、モデルバインディング用のブラックリスト、または...私が忘れていたものは何でも!

于 2013-09-27T12:18:01.747 に答える
2

多くのプロジェクトは、 View ModelDomain Modelから分離することを好みます。これにより、ドメイン モデルの正確性/一貫性を維持しながら、特定のアクションでレンダリングおよび/または受信するデータ用に特別に調整された View-Model クラスを作成できます。

View-Model クラスでは、作成日などのプロパティを定義しません (投稿されることは想定されていませんが、アクションで決定されるため)。または、レンダリングと投稿に同じView-Modelを使用し、日付をレンダリングする場合は、View-Modelで日付をnull可能にすることができます(Alexeyの回答を参照)ドメインモデルで必須のままにします。

于 2013-09-27T11:40:07.580 に答える