У меня есть список источников информации в базе данных, которые мне нужно передать в представление в MVC. Мне нужен конечный пользователь, чтобы иметь возможность отмечать источники информации, относящиеся к его курсу.
Я могу успешно передать просмотр списка источников информации вместе с флажками, используя следующий код.
public ViewResult CreateUpdateInfoSource(int ProgrammeId)
{
List<ProgInfoSourceModel> viewmodel = new List<ProgInfoSourceModel>();
List<ProgInfoSourceDTO> myProgInfoDTOList = progInfoSourceService.AllInfoSources();
if (myProgInfoDTOList.Count != 0)
{
foreach (var x in myProgInfoDTOList)
{
ProgInfoSourceModel insert = new ProgInfoSourceModel();
insert.Selected = false;
insert.ProgrammeId = ProgrammeId;
insert.InfoSourceId = x.InfoSourceId;
insert.InfoSource = x.InfoSource;
insert.InfoReference = x.InfoReference;
insert.Rank = x.Rank;
viewmodel.Add(insert);
}
}
return View(viewmodel);
}
Я могу распаковать это в представлении просто отлично, однако у меня есть реальная проблема с передачей списка обратно моему контроллеру. Мне нужно иметь возможность просматривать список в моем контроллере и видеть, какие из них применимы или нет, чтобы я мог обновить базу данных.
Моя модель выглядит так:
namespace ProgrammeSpec.MVC.Models
{
public class ProgInfoSourceModel
{
[DisplayName("Selected")]
public bool Selected { get; set; }
[DisplayName("Programme Id")]
public int ProgrammeId { get; set; }
[DisplayName("Info Source Id")]
public int InfoSourceId { get; set; }
[DisplayName("Info Source")]
public String InfoSource { get; set; }
[DisplayName("Reference")]
public String InfoReference { get; set; }
[DisplayName("Rank")]
public int? Rank { get; set; }
}
}
Мой взгляд выглядит так:
<html>
<head>
<title>CreateUpdateInfoSource</title>
</head>
<body>
@using (Html.BeginForm())
{
<table>
<tr>
<th>
Selected
</th>
<th>
ProgrammeId
</th>
<th>
InfoSourceId
</th>
<th>
InfoSource
</th>
<th>
InfoReference
</th>
<th>
Rank
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.CheckBoxFor(modelItem => item.Selected)
</td>
<td>
@Html.DisplayFor(modelItem => item.ProgrammeId)
</td>
<td>
@Html.DisplayFor(modelItem => item.InfoSourceId)
</td>
<td>
@Html.DisplayFor(modelItem => item.InfoSource)
</td>
<td>
@Html.DisplayFor(modelItem => item.InfoReference)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rank)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
</table>
<input type="submit" value="Update" />
}
</body>
</html>
и контроллер, которому передается представление, выглядит следующим образом: (фрагмент)
[HttpPost]
public ActionResult CreateUpdateInfoSource(List<ProgInfoSourceModel> viewmodel)
{
if (ModelState.IsValid)
{
try
{
Проблема в том, что модель представления является нулевой. Я понимаю, что это, вероятно, потому, что я распаковал список в представлении, чтобы он больше не был списком, но как мне тогда получить доступ к значениям флажков?
Дополнительным осложнением является то, что количество источников информации будет различаться, поэтому я не могу использовать статическую форму или список и дать каждому ID ...
Это должно быть довольно распространенная проблема с простым решением, но я новичок MVC и не знаю, как это обойти.