Передача списка из представления в контроллер в модели - PullRequest
1 голос
/ 13 апреля 2019

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

Вот пример (симуляция) того, чего я пытаюсь достичь:

Рассмотрим модель -

using System.Collections.Generic;

namespace WebApplication1.Models
{
    public class StudentViewModel
    {
        public string StudentId { get; set; }
        public string FeedBack { get; set; }
        public List<ScoreCard> ScoreCards;
    }

    public class ScoreCard
    {
        public string Subject { get; set; }
        public string Marks { get; set; }
    }
}

Контроллер -

public class StudentController : Controller
{
    public ActionResult Index()
    {
        var model = new StudentViewModel();
        model.StudentId = "Some Student";
        model.ScoreCards = new List<ScoreCard>
        {
            new ScoreCard()
            {
                Marks = "0",
                Subject = "English"
            },
            new ScoreCard()
            {
                Marks = "0",
                Subject = "Maths"
            }
        };
        return View("View", model);
    }

    public ActionResult SubmitScore(StudentViewModel model)
    {
        /* Some Code */
    }
}

Просмотр -

@model WebApplication1.Models.StudentViewModel
@{
    ViewBag.Title = "Title";
}

@using (Html.BeginForm("SubmitScore", "Student", FormMethod.Post))
{
    @Html.DisplayName(@Model.StudentId)<br />
    <label>Comment:</label><br/>
    @Html.EditorFor(m => m.FeedBack, new { htmlAttributes = new { @type = "text", id = @Model.FeedBack} })<br />
    for (var i = 0; i < @Model.ScoreCards.Count; i++)
    {
        @Html.DisplayName(@Model.ScoreCards[i].Subject) <br/>
        @Html.EditorFor(m => m.ScoreCards[i].Marks, new { htmlAttributes = new { @type = "number", @min = 0, id = @Model.ScoreCards[i].Marks} })<br />
    }
    <input class="btn btn-primary" type="submit" value="Submit" />
}

При запуске приложения -

enter image description here

Когда я нажимаю "Отправить", я вижу model.FeedBack, но список имеет значение NULL.

enter image description here

Нечто подобное достигается в этом вопросе и его ответе;Я не уверен, что именно мне здесь не хватает.

1 Ответ

1 голос
/ 13 апреля 2019

вы не отправляете ввод для Subject. Для этого вам потребуется скрытый ввод, а также любое другое значение, которое вы хотите вернуть в контроллер при публикации формы. Также для надписей должно работать простое текстовое поле.

@using (Html.BeginForm("SubmitScore", "Student", FormMethod.Post))
{
    @Html.DisplayName(@Model.StudentId)<br />
    @Html.HiddenFor(m => m.StudentId)
    <label>Comment:</label><br/>
    @Html.EditorFor(m => m.FeedBack, new { htmlAttributes = new { @type = "text", id = @Model.FeedBack} })<br />
    for (var i = 0; i < @Model.ScoreCards.Count; i++) {
        @Html.HiddenFor(m => m.ScoreCards[i].Subject)
        @Html.DisplayName(@Model.ScoreCards[i].Subject) <br/>
        @Html.TextBoxFor(m => m.ScoreCards[i].Marks, new { htmlAttributes = new { @type = "number", @min = 0} })<br />
    }
    <input class="btn btn-primary" type="submit" value="Submit" />
}

Наконец, вам нужно использовать свойства, чтобы привязка модели работала. В настоящее время у вас есть ScoreCards в качестве поля, поэтому обновите его до свойства.

public class StudentViewModel {
    public string StudentId { get; set; }
    public string FeedBack { get; set; }
    public List<ScoreCard> ScoreCards { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...