0

アイテムの配列 (いくつかあるかもしれません) で呼び出す EditorFor テンプレートがあり、インデックスを (ループではなく) 個別に参照するので、それらを特定の方法でレイアウトできます。

@Html.EditorFor(x => Model.SomeViewModels[0], "SomeTemplate")

すべて正常に動作しますが、理想的には、より優れたインデクサーで配列を参照したい

@Html.EditorFor(x => Model.SomeViewModels["検索する項目"], "SomeTemplate")

読みやすさと、インデックスが変更された場合に対処するための柔軟性のために、モデルにカスタムインデクサーを設定できるかどうか疑問に思っていました-このように

    public ObjecToReturn this[string TextToFind]
    {
        get
        {
                          return ObjectToReturn based on TextToFind
        }
    }

それは機能します-値を正しく取得しますが、Htmlを見ると、入力フィールドにはすべて名前が付けname=[Item to Find].AnswerValueられているため、理由がわかりますが、投稿が台無しになります

巧妙な人がModel.SomeViewModels["Item to Find"]EditorFor に送信する方法を考え出したのだろうかと思いましたが、テンプレートの基になる Html が反映Model.SomeViewModels[0]されているため (0 は配列内の「検索項目」のインデックスです)、Postback は機能します

または、これは間違ったアプローチかもしれません-何か簡単なものが欠けていることを願っています。

前もって感謝します

4

1 に答える 1

2

デフォルトDefaultModelBinderでは、インデクサーがゼロから始まり、連続しているバインド コレクションです。プロパティに非表示の入力を追加することで、これを機能させることができます (これはモデルのプロパティではなく、コレクションをバインドするために使用される特別な値であることにIndex注意してください)。Index例えば

<input type="text" name="SomeViewModels[ABC]" value = "" />
<input type="hidden" name="SomeViewModels.Index" value="ABC" />

<input type="text" name="SomeViewModels[XYZ]" value = "" />
<input type="hidden" name="SomeViewModels.Index" value="XYZ" />

value属性がインデクサー値と一致する非表示の入力を追加DefaultModelBinderすると、コレクションを正しくバインドできます

于 2015-02-26T23:28:38.980 に答える