4

ASP.NETMVCに単純なフォームがあります。これらの結果をコントローラーアクションに投稿しようとしていますが、奇妙な動作をしています。

view単純なHTMLテーブルです。

ビューの画像

HTMLフォームビューの一部は次のとおりです。

 <form action="/Applications/UpdateSurvey" method="post"><table id=questionsTable class=questionsTable border=1>
<thead><tr><td>Name</td><td>Answer</td><td>Name Attribute(for debugging)</td></tr>         </thead><tbody>
 <tr>
 <td>Question 0:</td>

 <td><input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=5 >5&nbsp;&nbsp;</td>
 <td>updater.questions[0].responseIds</td>
 </tr>
 <tr>
 <td>Question 1:</td>
 <td><input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=5 >5&nbsp;&nbsp;</td>

 <td>updater.questions[1].responseIds</td>
 </tr>
 </tbody></table>

  <input type="submit" value="Save" />

 </form>

バインディングオブジェクト:

public class SurveyUpdater
{
    public Question[] questions { get; set; }
}

public class Question
{
    public int[] responseIds { get; set; }
}

コントローラアクションコード:

    public ActionResult UpdateSurvey(SurveyUpdater updater)
    {
        if (updater.questions == null)
        {
            //I dont understand why this is getting hit
        }
        if (updater.questions.Length != 5)
        {
            //I dont understand why this is getting hit
        }

        return View("TestSurvey");
    }

テスト後、これが私の観察です:

  1. 各質問で少なくとも1つをCheckBox選択している場合、これは正常に機能し、コントローラーupdater.questions.Length == 5でデータが完全にバインドされます。

  2. 質問の1つにまったく答えないと、スキップした数と同じ大きさの配列しか得られません-1。したがって、質問3に答えなかった場合、コントローラーアクション2で配列を取得します。

  3. #2のロジックを使用することで、最初の質問に答えない場合は、次のようになりますnullupdater.questions

私が得たいもの(そして私が期待したもの)はそれです:

私は常にquestions長さを取得し、5質問の1つに答えなかった場合は、0そのインデックスのサイズの配列を取得するだけでしたresponseIds

これはASP.NETMVCモデルバインディングのバグですか?そうでない場合、私が見逃しているもの、または私が探している望ましい動作を取得する方法はありますか?

4

1 に答える 1

5

問題は、選択が選択されていない場合、入力がリクエストパラメータに戻されないためだと思います。これを回避する1つの方法は、各質問に対して最初に選択されたフィルターで除外できる既知の値を含むデフォルトの非表示のチェックボックスを用意することです(必要に応じて「未回答」チェックボックス)。これにより、各質問の選択が取得され、配列内の各要素に要求パラメーターが存在することが保証されます。

何が投稿されるかという観点から考えてみてください。値があり、名前があり、無効になっていない要素のみが投稿されます。すべての質問に値がない場合は、いくつの配列アイテムを作成する必要がありますか?せいぜい、最後に選択されたアイテムは配列のサイズであると推測できますが、その間のアイテムにはどのような値を使用する必要がありますか?フレームワークはあなたの心を読み取ることができず、おそらく、型のデフォルト値を提供することは合理的かもしれませんが、読むべきではありません。IMOの場合、値を省略して、必要に応じて開発者にデフォルトを提供するように強制することをお勧めします。それが起こっているようです。

于 2010-01-02T16:05:44.577 に答える