Сообщение формы ASP.Net MVC не может связывать свойство списка модели

asp.net-mvc-5 c# entity-framework-6 model-binding razor

Вопрос

Я пытаюсь создать страницу опроса, которая может иметь текстовые поля и списки переключателей или полей флажков. Независимо от того, что я пытаюсь, я не могу получить свойство model.Questions для привязки при отправке формы; модель создается с использованием свойства null Questions.

Скажите, пожалуйста, у вас есть идея, которая может мне помочь!

Модель вида выглядит следующим образом:

// Survey view model
public class Question
{
    public int Id { set; get; }
    public string QuestionText { set; get; }

    public bool IsHeading { get; set; }
    public bool IsList { get; set; }
    public bool IsCheckBox { get; set; }

    public List<Answer> Answers { set; get; }
    [Required]
    public string SelectedAnswer { set; get; }
    public string GivenAnswer { get; set; }
    public Question()
    {
        Answers = new List<Answer>();
        GivenAnswer = "-1";
        SelectedAnswer = "-1";
        QuestionText = "";
    }
}

public class Answer
{
    public int Id { set; get; }
    public string AnswerText { set; get; }
}

public class Assessment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LessonId { get; set; }
    public Module Lesson { get; set; }

    public SurveyType SurveyType { get; set; }

    public virtual List<Question> Questions { set; get; }
    public Assessment()
    {
        Questions = new List<Question>();
    }
}

Метод контроллера выглядит следующим образом:

// Survey view model
public class Question
{
    public int Id { set; get; }
    public string QuestionText { set; get; }

    public bool IsHeading { get; set; }
    public bool IsList { get; set; }
    public bool IsCheckBox { get; set; }

    public List<Answer> Answers { set; get; }
    [Required]
    public string SelectedAnswer { set; get; }
    public string GivenAnswer { get; set; }
    public Question()
    {
        Answers = new List<Answer>();
        GivenAnswer = "-1";
        SelectedAnswer = "-1";
        QuestionText = "";
    }
}

public class Answer
{
    public int Id { set; get; }
    public string AnswerText { set; get; }
}

public class Assessment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LessonId { get; set; }
    public Module Lesson { get; set; }

    public SurveyType SurveyType { get; set; }

    public virtual List<Question> Questions { set; get; }
    public Assessment()
    {
        Questions = new List<Question>();
    }
}

Где Assessment является основной моделью просмотра. Ниже представлены представление (Survey.cshtml) и шаблон редактора (EditorTemplates / Question.cshtml, для каждого Вопроса)

Survey.cshtml:

// Survey view model
public class Question
{
    public int Id { set; get; }
    public string QuestionText { set; get; }

    public bool IsHeading { get; set; }
    public bool IsList { get; set; }
    public bool IsCheckBox { get; set; }

    public List<Answer> Answers { set; get; }
    [Required]
    public string SelectedAnswer { set; get; }
    public string GivenAnswer { get; set; }
    public Question()
    {
        Answers = new List<Answer>();
        GivenAnswer = "-1";
        SelectedAnswer = "-1";
        QuestionText = "";
    }
}

public class Answer
{
    public int Id { set; get; }
    public string AnswerText { set; get; }
}

public class Assessment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LessonId { get; set; }
    public Module Lesson { get; set; }

    public SurveyType SurveyType { get; set; }

    public virtual List<Question> Questions { set; get; }
    public Assessment()
    {
        Questions = new List<Question>();
    }
}

EditorTemplates / Question.cshtml

// Survey view model
public class Question
{
    public int Id { set; get; }
    public string QuestionText { set; get; }

    public bool IsHeading { get; set; }
    public bool IsList { get; set; }
    public bool IsCheckBox { get; set; }

    public List<Answer> Answers { set; get; }
    [Required]
    public string SelectedAnswer { set; get; }
    public string GivenAnswer { get; set; }
    public Question()
    {
        Answers = new List<Answer>();
        GivenAnswer = "-1";
        SelectedAnswer = "-1";
        QuestionText = "";
    }
}

public class Answer
{
    public int Id { set; get; }
    public string AnswerText { set; get; }
}

public class Assessment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LessonId { get; set; }
    public Module Lesson { get; set; }

    public SurveyType SurveyType { get; set; }

    public virtual List<Question> Questions { set; get; }
    public Assessment()
    {
        Questions = new List<Question>();
    }
}

Вот список ключей, которые публикуются:

// Survey view model
public class Question
{
    public int Id { set; get; }
    public string QuestionText { set; get; }

    public bool IsHeading { get; set; }
    public bool IsList { get; set; }
    public bool IsCheckBox { get; set; }

    public List<Answer> Answers { set; get; }
    [Required]
    public string SelectedAnswer { set; get; }
    public string GivenAnswer { get; set; }
    public Question()
    {
        Answers = new List<Answer>();
        GivenAnswer = "-1";
        SelectedAnswer = "-1";
        QuestionText = "";
    }
}

public class Answer
{
    public int Id { set; get; }
    public string AnswerText { set; get; }
}

public class Assessment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LessonId { get; set; }
    public Module Lesson { get; set; }

    public SurveyType SurveyType { get; set; }

    public virtual List<Question> Questions { set; get; }
    public Assessment()
    {
        Questions = new List<Question>();
    }
}

ОБНОВИТЬ:

Просто небольшое пояснение: объект Question может представлять заголовок (без полей) или ввода (либо переключатели, флажки, либо текстовые поля). Насколько я могу судить, нужные мне значения публикуются правильно. Я попытаюсь схватить их из отладчика и отправить здесь.

ОБНОВИТЬ:

Ниже приведена строка запроса: Request.Form.ToString (), с расширением и форматированием URL для упрощения чтения. Как вы можете видеть, значения публикуются, но по некоторым причинам не привязаны к оценке. Может ли это быть из-за значения xx в Вопросах [xx], потому что это не значение индекса, а фактическое значение Id?

// Survey view model
public class Question
{
    public int Id { set; get; }
    public string QuestionText { set; get; }

    public bool IsHeading { get; set; }
    public bool IsList { get; set; }
    public bool IsCheckBox { get; set; }

    public List<Answer> Answers { set; get; }
    [Required]
    public string SelectedAnswer { set; get; }
    public string GivenAnswer { get; set; }
    public Question()
    {
        Answers = new List<Answer>();
        GivenAnswer = "-1";
        SelectedAnswer = "-1";
        QuestionText = "";
    }
}

public class Answer
{
    public int Id { set; get; }
    public string AnswerText { set; get; }
}

public class Assessment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int LessonId { get; set; }
    public Module Lesson { get; set; }

    public SurveyType SurveyType { get; set; }

    public virtual List<Question> Questions { set; get; }
    public Assessment()
    {
        Questions = new List<Question>();
    }
}

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ:

Проблема заключалась в том, что я не отправлял ничего на сервер для Вопросов, которые являются заголовками, поэтому индекс «Вопросы» на самом деле был неполным. Добавление скрытого поля идентификатора с каждым заголовком устраняет проблему.

Принятый ответ

Я создал базовый проект, в котором использовались приведенные вами образцы кода, а также некоторые основные фиктивные данные и сборник вопросов.

Я предполагаю, что в данных для конкретного опроса есть что-то, что вы делаете, что вызывает проблему.

Посмотрев на код, я вижу две возможные проблемы:

  • Когда Question.IsHeader истинно, я не думаю, что что-то будет отправлено обратно в форму для этого вопроса. Я бы предположил, что модельное связующее ничего не подбирает для этого вопроса. Который из ваших данных формы выглядел бы так: у него отсутствуют индексы для 0, 4 и 8. На самом деле я не знаю, приведет ли это к повреждению модели, но это может сделать. Вы можете попробовать поставить HiddenFor для идентификатора вопроса в разделе шаблона редактора вопросов, где IsHeading истинно.
  • Код @Html.CheckBox вы используете форматы входных значений с использованием идентификатора вопроса, а не индекса вопроса в списке. Я бы предположил, что это тоже сломает привязку.

Надеемся, что если вы сможете исправить эти проблемы, привязка будет работать. Я предлагаю попробовать его в опросе без каких-либо вопросов с заголовком и без вопросов с помощью галочки или радиокнопки и посмотреть, работает ли привязка.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему