Как привязать список класса, который включает словарь, к представлению в asp.net ядро?

#html #asp.net-core

#HTML #asp.net-ядро

Вопрос:

У меня есть класс, который включает в себя один словарь<int,string> . int — это клавиша переключателя, а value — заголовок выбора. Я пытаюсь получить список словарей в контроллере, включающий ключи и значения переключателей. когда я запускаю программу, список равен 0. Я думаю, что что-то не так с названием переключателей и вводом заголовка выбора, но я не знаю, что мне написать.

 public class ChoiceQuestion
{
    public int QuestionId { get; set; }
    public Dictionary<int, string> Choice { get; set; }
    public int Answer { get; set; }    
}
 

в контроллере у меня есть это:

  public IActionResult CreateQuestion(int courseId, List<ChoiceQuestion> choices,
        QuestionType type, Question question)
    {
        _questionService.AddQuestion(courseId, type, choices, question);

        return RedirectToAction("Index");
    }
 

и это мое мнение:

  <div class="form-group choiceDiv" style="display: none;" id="choiceDiv">
            <a id="plus"><i class="glyphicon glyphicon-plus"></i></a>
            <input type="radio" name="choices.choice[0].key" value="1" />
            <input type="text" placeholder="گزینه " name="choices.choice[0].value" />

            <input type="radio" name="choices.choice[1].key" value="1" />
            <input type="text" placeholder="گزینه " name="choices.choice[1].value" />

            <span asp-validation-for="Choice" class="text-danger"></span>
        </div>
 

Ответ №1:

Во-первых, вы хотите передать данные List<ChoiceQuestion> choices , поэтому ваше имя ввода должно быть choices[xxx].choice[xxx] .

И затем вы можете изменить имя ввода типа текста перед отправкой формы, чтобы значение ввода типа текста было привязано к dictionary of List<ChoiceQuestion> choices . Вот рабочая демонстрация:

 <form method="post" id="myform">
    <div class="form-group choiceDiv" style="display: none;" id="choiceDiv">
        <a id="plus"><i class="glyphicon glyphicon-plus"></i></a>
        <input type="radio" name="choices[0].choice[0].key" value="1" />
        <input type="text" placeholder="گزینه " name="choices[0].choice[key]" value="choicetitle1" />

        <input type="radio" name="choices[0].choice[1].key" value="2" />
        <input type="text" placeholder="گزینه " name="choices[0].choice[key]" value="choicetitle2" />

        <span asp-validation-for="Choice" class="text-danger"></span>
    </div>
    <input type="submit" value="submit" />
</form>
<script>
    $('#myform').submit(function () {
        var keys = [];
        var count = 0;
        $("#choiceDiv input[type='radio']").each(function () {
            keys.push($(this).val());
        });
        $("#choiceDiv input[type='text']").each(function () {
            $(this).attr("name", $(this).attr("name").replace("key", keys[count]));
            count  ;
        });
    });
</script>
 

Я меняю имена ввода текстового типа на choices[0].choice[key] , и перед отправкой формы я заменяю «ключ» в имени на значение переключателя.И затем форма опубликует данные словаря.

Результат: введите описание изображения здесь

Или вы можете удалить переключатели и использовать представление следующим образом:

 <div class="form-group choiceDiv" style="display: none;" id="choiceDiv">
            <a id="plus"><i class="glyphicon glyphicon-plus"></i></a>
            <input type="text" placeholder="گزینه " name="choices[0].choice[1]" value="choicetitle1"/>

            <input type="text" placeholder="گزینه " name="choices[0].choice[2]" value="choicetitle2"/>

            <span asp-validation-for="Choice" class="text-danger"></span>
        </div>
 

И тогда вы получите ключ = 1, значение = «choicetitle1»; ключ = 2, значение = «choicetitle2» в словаре.