EditFor 関数を使用してビューでレンダリングしているモデルにオブジェクトのコレクションがあり、各オブジェクトを実際にレンダリングするための EditorTemplate があります。
@Html.EditorFor(model => model.MyObjects)
これはしばらくうまく機能しており、html を確認すると、テキスト ボックスにはモデル プロパティのプレフィックスが付けられ、その後に元のコレクションのインデックスが続きます。
<input class="text-box single-line" id="MyObjects_2__SomeProperty"
name="MyObjects[2].SomeProperty" type="Text" value="" />
ただし、最近、コレクションのモデル メタデータで ShowForEdit および ShowForDisplay プロパティを使用し始めました。ShowForEdit が true でない場合は、エディター テンプレートの最初の行でスキップします。
@if (!ViewData.ModelMetadata.ShowForEdit)
{
return;
}
しかし、これらはすべて html でインデックス化されているため、このコレクションをポストバック経由でビューモデルに保存しようとすると、インデックス番号に依存するために失敗します。欠落しているインデックスの後のコレクション内のすべてのアイテムは、値を確認すると、ビュー モデルから欠落しています。
この場合、編集ビューに表示したくないのでスキップするのは、実際にはコレクション内の最初の項目ですが、このため、html の最初のインデックスをポストバックすると 1 (0 ではなく) になります。通常のように)、変更を保存しようとすると、これが問題になります。これは、javascript を使用して DOM を変更する場合にも問題になります。
HTML で表現されたコレクションに 1 つ以上のインデックスが存在しない場合に、デフォルトのモデル バインダーがポストバックされたデータを読み取る機能で問題が発生した人はいますか?
この問題を処理するモデル バインダーはありますか?