ページに次の入力があります。
@using(Html.BeginForm())
{
@Html.TextBox(String.Format("someData[{0}].Key", 0))
@Html.TextBox(String.Format("someData[{0}].Key", 1))
@Html.TextBox(String.Format("someData[{0}].Value", 0))
@Html.TextBox(String.Format("someData[{0}].Value", 1))
<input type="submit" value="Go" />
}
このデータを投稿すると、MVCのデフォルトのモデルバインダーを介してIDictionaryにバインドする必要があるという印象を受けました。ただし、辞書のキーは数値にする必要があります。
public ActionResult MyAction(IDictionary<long?, string> someData)
{
//...
}
クライアント側でこれらのフィールドを検証するためにJavascriptを使用していますが、JSをオフにして、ボックスに何も入力せずにフォームを送信するInvalidCastException
と、モデルバインダーがsomeDataコレクションにバインドできないというメッセージが表示されます。
以前のバージョンのMVC(最近アップグレードした)では、Dictionaryキーはnull可能(long?)
であるため、「。Key」入力に無効なデータが入力された場合(つまり、数値以外)、辞書はコレクション。
確かに、この場合、JSを有効にせずに空のフォームを送信できますか?フォームを送信してもアクションがヒットしない(ブレークポイント)ため、自分でエラーをキャッチしてModelStateに追加することはできません...