我试图将一个复杂的数据结构从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" />
}
当我运行应用程序时-
单击“提交”时,我可以看到model.FeedBack
,但列表设置为空。
在此question中实现了类似的结果,这是答案。我不确定这里到底缺少什么。
答案 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; }
}