我正在做一个小项目。目的是在某些特定日期保持几个用户的存在。此日期首先由用户选择。
因此我使用了一个视图模型。这将提供所有可能的数据,并在表格中显示一个复选框以向用户显示。
在视图中,我每天都在给定的视图模式中走路,我让视图生成一个标签和一个编辑器对象(Html.EditorFor())。所有这些都被表单创建(@ Html.BeginForm())所包围。渲染视图不是问题。
问题是当我尝试返回视图模型时。我收到的viewmodel对象是一个null对象本身。就像它是由默认构造函数创建的。
控制器:
[HttpGet]
public ActionResult OpldagenLt()
{
var lt = _gebruikerRepository.GeefTraject(_gebruikerRepository.TrajectId);
List<DatumModel> data = new List<DatumModel>();
foreach (Opleidingdag opldag in lt.GeefOpleidingdagenKleinerDanOfGelijkAanVandaag())
data.Add(new DatumModel(opldag));
List<ToekomstModel> toekomst = new List<ToekomstModel>();
foreach (Opleidingdag opldag in lt.GeefOpleidingdagenGroterDanVandaag())
toekomst.Add(new ToekomstModel(opldag));
DataModel datamod = new DataModel();
datamod.Datums = data;
datamod.Toekomst = toekomst;
if (lt.ControleerAantalOpleidingdagen())
{
_gebruikerRepository.GekozenDagen = GekozenDagen(datamod) as List<Opleidingdag>;
return RedirectToAction("Index", "Aanwezigheid");
}
return View(datamod);
}
[HttpPost]
public ActionResult OpldagenLt(DataModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
_gebruikerRepository.GekozenDagen = GekozenDagen(model) as List<Opleidingdag>;
return RedirectToAction("Index", "Aanwezigheid");
}
public ICollection<Opleidingdag> GekozenDagen(DataModel datamod)
{
List<Opleidingdag> dagen = new List<Opleidingdag>();
foreach (DatumModel datum in datamod.Datums)
{
dagen.Add(datum.Dag);
}
return dagen;
}
查看:
@using(@Html.BeginForm( "OpldagenLt", "Leertraject", FormMethod.Post))
{
<div>
<table>
<tr>
<th colspan="2">reeds begonnen dagen</th>
</tr>
@foreach (var item in @Model.Datums)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.Dag.Dag.Day)/@Html.DisplayFor(modelItem => item.Dag.Dag.Month)/@Html.DisplayFor(modelItem => item.Dag.Dag.Year)</td>
<td>@Html.EditorFor(modelItem => item.Checked)</td>
</tr>
}
</table>
</div>
<div id="toekomst">
<table>
<tr>
<th>Dagen in de toekomst</th>
</tr>
@foreach (var item in @Model.Toekomst)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.Dag.Dag.Day)/@Html.DisplayFor(modelItem => item.Dag.Dag.Month)/@Html.DisplayFor(modelItem => item.Dag.Dag.Year)</td>
</tr>
}
</table>
</div>
<div>
<p><input type="submit" value="Volgende"/></p>
</div>
}
型号:
using System;
using System.Collections.Generic;
using ProjectII.Models.domain;
namespace ProjectII.Viewmodels
{
public class DataModel
{
public DataModel()
{
Datums = new List<DatumModel>();
}
public ICollection<DatumModel> Datums { get; set; }
public ICollection<ToekomstModel> Toekomst{ get; set; }
}
public class DatumModel
{
public DatumModel()
{
Dag = new Opleidingdag(new DateTime().Date);
Checked = true;
}
public DatumModel(Opleidingdag opldag)
{
Dag = opldag;
Checked = true;
}
public Opleidingdag Dag { get; set; }
public bool Checked { get; set; }
}
public class ToekomstModel
{
public ToekomstModel()
{
Dag = new Opleidingdag(new DateTime().Date);
}
public ToekomstModel(Opleidingdag opldag)
{
Dag = opldag;
}
public Opleidingdag Dag { get; set; }
}
}
提前感谢您的帮助
答案 0 :(得分:0)
使用构建视图的方式,ModelBinder不能在列表中的不同元素之间进行区分,也不会将它们识别为列表中的项目。尝试构建这样的视图:
@{ int datumteller = 0; }
@foreach (var item in @Model.Datums)
{
<tr>
<td>@Html.DisplayFor(modelItem => @Model.Datums[datumteller].Dag.Dag.Day)/@Html.DisplayFor(modelItem => @Model.Datums[datumteller].Dag.Dag.Month)/@Html.DisplayFor(modelItem => @Model.Datums[datumteller].Dag.Dag.Year)</td>
<td>@Html.EditorFor(modelItem => @Model.Datums[datumteller].Checked)</td>
</tr>
datumteller++;
}
@{ int toekomstteller = 0; }
@foreach (var item in @Model.Toekomst)
{
<tr>
<td>@Html.DisplayFor(modelItem => @Model.Toekomst[toekomstteller].Dag.Dag.Day)/@Html.DisplayFor(modelItem => @Model.Toekomst[toekomstteller].Dag.Dag.Month)/@Html.DisplayFor(modelItem => @Model.Toekomst[toekomstteller].Dag.Dag.Year)</td>
</tr>
toekomstteller++
}
答案 1 :(得分:0)
@stephen:谢谢你的帮助。 在我的脑海中保持你的答案,我终于成功地返回了这些数据。
我把foreach变成了for 并将ICollection更改为List
型号:
using System;
using System.Collections.Generic;
using ProjectII.Models.domain;
namespace ProjectII.Viewmodels
{
public class DataModel
{
public List<DatumModel> Datums { get; set; }
public List<ToekomstModel> Toekomst{ get; set; }
}
public class DatumModel
{
public DatumModel()
{
Dag = new Opleidingdag(new DateTime().Date);
Checked = true;
}
public DatumModel(Opleidingdag opldag)
{
Dag = opldag;
Checked = true;
}
public Opleidingdag Dag { get; set; }
public bool Checked { get; set; }
}
public class ToekomstModel
{
public ToekomstModel()
{
Dag = new Opleidingdag(new DateTime().Date);
}
public ToekomstModel(Opleidingdag opldag)
{
Dag = opldag;
}
public Opleidingdag Dag { get; set; }
}
}
视图:
@model ProjectII.Viewmodels.DataModel
@using(@Html.BeginForm())
{
<div>
<table>
<tr>
<th colspan="2">reeds begonnen dagen</th>
</tr>
@for (int i = 0; i < Model.Datums.Count; i++)
{
<tr>
<td>@Html.DisplayFor(modelItem => Model.Datums[i].Dag.Dag.Day)/@Html.DisplayFor(modelItem => Model.Datums[i].Dag.Dag.Month)/@Html.DisplayFor(modelItem => Model.Datums[i].Dag.Dag.Year)</td>
<td>
@Html.EditorFor(modelItem => Model.Datums[i].Checked)
</td>
</tr>
}
</table>
@*@for (int i = 0; i < Model.Datums.Count; i++)
{
<div> @Html.DisplayFor(x => Model.Datums[i].Dag.Dag)
@Html.CheckBoxFor(x => Model.Datums[i].Checked) </div>
}*@
</div>
<div id="toekomst">
<table>
<tr>
<th>Dagen in de toekomst</th>
</tr>
@foreach (var item in @Model.Toekomst)
{
<tr>
<td>@Html.DisplayFor(modelItem => item.Dag.Dag.Day)/@Html.DisplayFor(modelItem => item.Dag.Dag.Month)/@Html.DisplayFor(modelItem => item.Dag.Dag.Year)</td>
</tr>
}
</table>
</div>
<div>
<p><input type="submit" value="Volgende"/></p>
</div>
}
现在我收到一个具有正确值的模型
感谢帮助人