Вопрос

У меня есть простая форма в ASP.NET MVC. Я пытаюсь опубликовать эти результаты в действие контроллера, и я получаю странное поведение.

А view это простая таблица HTML:

Picture of view

Вот часть представления формы 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. Если у меня есть хотя бы один CheckBox Выбран на каждом из вопросов, это работает нормально и в моем контроллере updater.questions.Length == 5 и данные связываются идеально.

  2. Если я вообще не отвечаю на один из вопросов, я получаю всего лишь массив, как номер, который я пропустил: -1. Анкет Так что, если я не ответил на вопрос № 3, я получаю массив в действии контроллера 2.

  3. Используя логику #2, если я не отвечу на первый вопрос, я просто получаю null за updater.questions

Я хочу получить (и что я ожидал), так это:

Я бы всегда получил questions с длиной 5 И в тех случаях, когда я не ответил на один из вопросов, я просто получил бы 0 размер массива для этого индекса responseIds.

Это ошибка в привязке модели ASP.NET MVC? Если нет, то есть ли мне что -то не хватает или какой -либо способ получить желаемое поведение, которое я ищу?

Это было полезно?

Решение

Проблема, я думаю, заключается в том, что, когда выбранные выборы не выбраны, входные данные даже не передаются обратно в параметры запроса. Одним из способов обойти это было бы иметь скрытый флажок по умолчанию, содержащий известное значение, которое вы могли бы отфильтровать выбранную изначально для каждого вопроса (флажок «не ответил», если хотите). Это гарантирует, что вы получите выбор для каждого вопроса, и что для каждого элемента существует параметр запроса в массиве.

Подумайте об этом с точки зрения того, что отправляется обратно. Только те элементы, которые имеют значения, имеют имена и не отключены. Если не все вопросы имеют значения, то сколько элементов массива он должен создать? В лучшем случае может догадаться, что последним выбранным элементом должен быть размер массива, но какие значения он должен использовать для любых элементов между ними? Структура не может прочитать ваш разум, и, возможно, не должно, хотя предоставление значения по умолчанию для типа может быть разумным. ИМО, было бы лучше просто опустить ценность и, таким образом, заставить разработчика предоставить по умолчанию по умолчанию при желании. Кажется, это то, что происходит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top