ビュー モデルに基づいて多数の入力を表示する部分ビューがあります。場合によっては、これらの入力の一部が部分ビューによってレンダリングされず[Required]
、ビュー モデルの属性で装飾されていることがあります。その結果、フォームがコントローラーにポストバックされると、 ModelState.IsValid
false が返されます。これをバイパスする方法はありますか?
4 に答える
常に VIEW モデルを DOMAIN モデルから分離する必要があります。これには非常に正当な理由があり、セキュリティに関係しています。ドメイン モデルをビュー モデルとして使用すると、オーバーポスティング攻撃やアンダーポスティング攻撃に対して脆弱になります。詳細については、次のページを参照してください。
- http://odetocode.com/blogs/scott/archive/2012/03/12/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx
- http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx
- https://hendryluk.wordpress.com/tag/asp-net-mvc/
つまり、フィールドが必要ない場合は、ビューモデルに含めないでください。変換する必要があります-ビューモデルをドメインモデルにマップします。面倒かもしれませんが、アプリケーションの安全性が大幅に向上します。Automapper などのマッピングを支援するために使用できるライブラリがあります。
編集:私の最初の答え以来、このタイプのシナリオに対処する最も簡単な方法は、ビューモデルに IValidatableObject インターフェイスを実装させ、Validate メソッド内に検証ロジックを記述することであるという結論に達しました。クライアント側の検証は提供しませんが、独自のカスタム フィルターを作成せずにカスタム/シナリオ ベースの検証を実現する最も効果的でクリーンな方法です。
ここで詳細を読むことができます: http://weblogs.asp.net/scottgu/class-level-model-validation-with-ef-code-first-and-asp-net-mvc-3