1

コントローラーにポストバックしたばかりのビューにあるフィールドのリストをプログラムで安全に取得することは可能ですか?

scaffolding のデフォルトの実装に問題があることに気付きました。

DB.Entry(model).State = EntityState.Modified
DB.SaveChanges()

問題は、編集するフィールドをビューに含めていない場合、オブジェクトの作成時に .NET が割り当てるフィールドの既定値によって上書きされることです。例えば。ID、Email、および PasswordHash を持つ User クラスがあり、ユーザーが自分の E メールアドレスのみを更新できるようにしたい場合、PasswordHash フィールドに何も含めないと、コントローラーに渡されるときに NULL にリセットされます。ヌルとして。現時点では、データベースから現在のオブジェクトを取得し、渡されたモデルからビューにあることがわかっているフィールドのみを更新することで、この問題を回避しています。これは小さなテーブルではそれほど問題ではありませんが、特に開発中に発生する可能性のある大きなテーブルの場合は、コードを毎回更新する必要がなく、全面的に適用できる一般的なソリューションが必要です。

POST 変数をループして何が投稿されたかを調べることができることはわかっていますが、ユーザーが編集したくない追加のフィールドを挿入できるため、セキュリティ上の問題が発生します。編集してほしくないものを明示的に除外することもできると思いますが、それを避けることができる場合は、維持する必要があるため、それらをリストする必要はありません。

ここには2つの問題があると思いますが、どちらも解決できるかどうかはわかりません...

  • ポストバックしたビューを取得する
  • そのビューに含まれるフィールドを確立する (そのために一時的に再構築する必要があるかもしれません)。

単一のビューのコントローラーでそのメソッドしか使用できなかったので、おそらく最初のものを無視して逃げることができると思います。それはまだ私が望むよりも少しきれいではありませんが、ビューにどのフィールドがあるかを確立するだけで問題が軽減されます。

4

1 に答える 1

1

ビューに特定のプロパティのみが必要な場合は、それらのプロパティのみを使用してインターフェイスを作成します。このインターフェイスは、HttpGetメソッドとHttpPostメソッドで使用します。

次に、AutoMapperなどを使用して、ビューモデルをエンティティにマップできます。

于 2012-11-27T10:27:13.103 に答える