将列表从视图传递到模型中的控制器

时间:2019-04-12 23:52:08

标签: c# asp.net-mvc razor model-view-controller

我试图将一个复杂的数据结构从Controller传递到View并返回到包含列表的Controller。我可以在“视图”中看到列表项。我想编辑这些并将其发送回控制器。我可以编辑一些属性,但是对于列表,我在控制器中得到了空值。

这是我要实现的目标的一个示例(模拟):

考虑模型-

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,但列表设置为空。

enter image description here

在此question中实现了类似的结果,这是答案。我不确定这里到底缺少什么。

1 个答案:

答案 0 :(得分:1)

您没有发送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; }
}