2017-03-21 7 views
3

にアレイ上の読み取り専用でありますFruitBoxは1〜3の間で指定できます。BoxLabels、それ以上はありません。これを強制するには、Listの代わりにを使用すると思いました。コレクションは、私はこのようになりますMVCのViewModelを持っているViewModelに

私は、ページ上の私の入力を処理する私のかみそりビューでループを持っている:私はフォームを送信すると、私はエラーと死の黄色の画面(YSOD)を取得

@for(var i = 0; i < 3; i++) 
{ 
    @Html.LabelFor(model => Model.BoxLabels[i].SkuCode) 
    @Html.EditorFor(m => Model.BoxLabels[i].SkuCode, new { htmlAttributes = new { @class = "form-control" } }) 
} 

Collection is read-only.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NotSupportedException: Collection is read-only.

ViewModelなどで配列を使用しないでください。

+0

'BoxLabel'と' BoxLabelViewModel'の定義は何ですか? – Jure

+0

1つは私が修正したタイプミスで、今は 'BoxLabelViewModel'のコードを追加しました – Ciwan

+2

1つの最適化提案。 'for'ステートメントに 'Model.Boxlabels.Length'(または' Count')を使用してください。固定された番号3ではなく、項目数を変更する場合は2つの場所で番号を編集する必要はありません。 – Jure

答えて

3

これは、リストの代わりに配列を使用する「あなたがいる」ケースの1つです。モデルバインダーはコンストラクターに1つを指定したため、配列の新しいインスタンスを作成しません。その後、IListインスタンスとして使用し、InsertまたはAddを呼び出すと、そのような呼び出しは配列に対して失敗し、リストでは成功します。

割り当てフォームのコンストラクタを削除するか、モデル内のリストを使用して、投稿リクエストを送信する前にフォームを検証するためにJSを記述するだけです。次に、サーバー側のアイテムの数を検証します。

+0

ありがとう、それは知っているのは良いことです。私はこれについて全く知らなかった! – Ciwan

+0

これは正しくありません。 'DefaultModelBinder'は配列に正しく束縛されます。実際の問題は、BoxLabels = new BoxLabelViewModel [3];を設定して、読み取り専用コレクションを作成するコンストラクタです。 (IList 'を使用すると、3つの要素を追加して' for(int i = 0; i

+0

@StephenMueckeはより正確に編集されました – Rafal

関連する問題