Простая проблема, но я не могу понять, чего не хватает. У меня простая ViewModel (она станет больше):
public class TigerTrackingViewModel
{
public TigerTrackingViewModel()
{
this.TigerTrail = new TigerTrail();
}
public Guid YouthGuid { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public TigerTrail TigerTrail { get; set; }
}
TigerTrail - это вложенный объект. Вот все свойства и подсвойства:
public class TigerTrail
{
public TigerTrail()
{
DoneDate = new DateTime(1950, 01, 01);
TigerTrailRequiredBadges = new Collection<TigerTrailRequiredBadge>();
TigerTrailElectivedBadges = new Collection<TigerTrailElectiveBadge>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<TigerTrailRequiredBadge> TigerTrailRequiredBadges { get; set; }
public virtual ICollection<TigerTrailElectiveBadge> TigerTrailElectivedBadges { get; set; }
//public virtual ICollection<Youth> Youth { get; set; }
public bool? Done { get; set; }
public DateTime? DoneDate { get; set; }
}
Итак, у него есть TigerTrailRequiredBadges:
public class TigerTrailRequiredBadge
{
public TigerTrailRequiredBadge()
{
DoneDate = new DateTime(1950, 01, 01);
TigerTrailRequiredBadgeSubRequirements = new Collection<TigerTrailRequiredBadgeSubRequirement>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<TigerTrailRequiredBadgeSubRequirement> TigerTrailRequiredBadgeSubRequirements { get; set; }
public bool Done { get; set; }
public DateTime DoneDate { get; set; }
}
И там есть TigerTrailRequiredBadgeSubRequirement (s):
public class TigerTrailRequiredBadgeSubRequirement
{
public TigerTrailRequiredBadgeSubRequirement()
{
DoneDate = new DateTime(1950, 01, 01);
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string ShortCode { get; set; }
public string Type { get; set; } //Family, Den, Go See It
public string Description { get; set; }
public bool Done { get; set; }
public DateTime DoneDate { get; set; }
}
Еще в классе TigerTrail.cs был также класс Elective Badge:
public class TigerTrailElectiveBadge
{
public TigerTrailElectiveBadge()
{
DoneDate = new DateTime(1950, 01, 01);
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int Number { get; set; }
public string Name { get; set; }
public string Requirement { get; set; }
public bool Done { get; set; }
public DateTime DoneDate { get; set; }
}
Итак, есть ВСЕ свойства, которые будут доступны через мою ViewModel. К сожалению, есть по большей части все необходимое. Он большой и уродливый, но я должен заставить его работать.
В методе GET контроллера:
public ActionResult TigerTrail()
{
var vm = new List<TigerTrackingViewModel>();
var pack = Ctx.CubPacks.FirstOrDefault(x => x.Id == PackId);
var permTrail = Ctx.TigerTrails.FirstOrDefault(x => x.Name.Contains("PERM"));
foreach (var youth in pack.Youths)
{
//if anyone does not have this trail set up, make a new one.
if (youth.TigerTrail == null)
{
youth.TigerTrail = new TigerTrail();
if (youth.TigerTrail.TigerTrailElectivedBadges == null)
{
youth.TigerTrail.TigerTrailElectivedBadges = new Collection<TigerTrailElectiveBadge>();
}
if (youth.TigerTrail.TigerTrailRequiredBadges == null)
{
youth.TigerTrail.TigerTrailRequiredBadges = new Collection<TigerTrailRequiredBadge>();
}
youth.TigerTrail = permTrail;
}
youth.TigerTrail.Name = youth.FirstName + " " + youth.LastName + " Tiger Trail";
vm.Add(new TigerTrackingViewModel
{
FirstName = youth.FirstName,
LastName = youth.LastName,
YouthGuid = youth.YouthGuid,
TigerTrail = youth.TigerTrail
});
}
return View(vm);
}
в почтовом методе:
[HttpPost]
public ActionResult TigerTrail(List<TigerTrackingViewModel> youths)
{
return View();
}
Постбек возвращается нулевым каждый раз. Вот вид:
@model List<eTrail.Cubs.ViewModels.TigerTrackingViewModel>
@{
ViewBag.Title = "Award Tracking";
Layout = "~/Areas/App/Views/Shared/_BackendDashboard.cshtml";
}
<h1>Award Tracking</h1>
<hr />
<div class="row">
<div class="span12">
@using (Html.BeginForm("TigerTrail", "Awards", FormMethod.Post, new { @class = "form-horizontal" }))
{
for (int i = 0; i < Model.Count; i++)
{
@Html.HiddenFor(x => Model[i].TigerTrail)
foreach (var item in Model[i].TigerTrail.TigerTrailElectivedBadges)
{
@Html.DisplayFor(x => item.Done)
@Html.DisplayFor(x => item.DoneDate)
@Html.DisplayFor(x => item.Id)
@Html.DisplayFor(x => item.Name)
@Html.DisplayFor(x => item.Number)
@Html.DisplayFor(x => item.Requirement)
}
}
<input type="submit" value="submit" />
}
</div>
</div>
Я добавил все поля HiddenFor повсюду, поскольку было высказано предположение, что все они должны быть там, чтобы его можно было отправить обратно. По-прежнему не повезло. Если я просматриваю исходный код на странице, идентификаторы / имена появляются следующим образом:
<li>
<input id="elec_Done" name="elec.Done" type="checkbox" value="true"><input name="elec.Done" type="hidden" value="false">
<b>Pet Care</b>
Visit a veterinarian or animal groomer
<input id="elec_Number" name="elec.Number" type="hidden" value="43">
<input id="elec_DoneDate" name="elec.DoneDate" type="hidden" value="1/1/1950 12:00:00 AM">
</li>
Что теряется при переводе? Как я могу вернуть список контроллеру?
ИЗМЕНИТЬ
Основываясь на двух ответах с момента награждения, мне нужно уточнить это: в методе httppost список, который я должен получать, будет иметь значение null.
[HttpPost]
public ActionResult TigerTrail(List<TigerTrackingViewModel> youths) //this is what is null on postback.
{
. . . Do work with youths . .
return RedirectToAction(...);
}