0

ページに次の入力があります。

@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に追加することはできません...

4

1 に答える 1

1

これは私にとってはうまくいきます:

[HttpGet]
public ActionResult Index()
{
    return View();
}

[HttpPost]
public ActionResult Index(IDictionary<long?, string> someData)
{
    if (ModelState.IsValid)
    {
        // do some stuff here...
    }
    return View();
}

ただし、null値で投稿すると、無効なキャストが生成されます。これは既知の問題であり、http://aspnetwebstack.codeplex.com/workitem/373で確認されています。

于 2012-12-18T15:56:14.320 に答える