Ich habe eine Reihe von Auszeichnungen aus meiner Sicht und innerhalb jeder Auszeichnung gibt es eine entsprechende Liste von Qualifikationen. Ich habe ein ViewModel erstellt, um jeden Award anzuzeigen und mit einem Klick auf eine Schaltfläche sollte ein Modal mit seinen relevanten Qualifikationen erscheinen, die vom Benutzer als abgeschlossen/aktualisiert markiert werden können. Allerdings wird auf dem Post der Daten nur mein erster Award in meiner Controller-Methode binden. Der Rest wird als Null zurückkommen, wenn ich in VS debugge. Die Daten erscheinen meiner Ansicht nach wie erwartet, wobei jeder Award nur seine relevanten Qualifikationen aufweist. Vielen Dank im Voraus für die Hilfe.C# MVC ViewModel One Posted Ergebnis bindet, während andere Null sind
Ansichtsmodell
public class CandidateExtended
{
public CandidateExtended()
{
this.Qualifications = new List<Qualification_Extended>();
}
public int AwardID { get; set; }
public int FrameworkID { get; set; }
public string ULN { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
public string TitleShort { get; set; }
public string TitleFull { get; set; }
public DateTime DOB { get; set; }
public string Award { get; set; }
public int AwardLevel { get; set; }
public string Status { get; set; }
public string Completion { get; set; }
public string SelectedRoute { get; set; }
public List<Qualification_Extended> Qualifications { get; set; }
public void addQualification(Qualification_Extended qualification)
{
Qualifications.Add(qualification);
}
}
-Controller
[HttpGet]
public ActionResult Index()
{
var awardDetails = (from award in db.award
join candidate in db.candidate
on award.ULN equals candidate.ULN
join framework in db.framework
on award.QAN equals framework.QAN
where award.OrganisationIdentityID == organisationID
select new AwardDetails_Extended
{
AwardID = award.AwardID,
ULN = award.ULN,
AwardStatus = award.AwardStatus,
Forename = candidate.Forename,
Surname = candidate.Surname,
DOB = candidate.DOB,
FrameworkID = framework.FrameworkID,
TitleFull = framework.TitleFull,
TitleShort = framework.TitleShort,
AwardLevel = framework.AwardLevel,
Award = framework.Award,
Completion = framework.Completion
}).ToList();
var qualificationDetails = (from candidateQualification in db.candidateQualification
join qualification in db.qualification
on candidateQualification.QualificationID equals qualification.QualificationID
select new Qualification_Extended
{
ID = candidateQualification.ID,
QualificationID = candidateQualification.QualificationID,
ULN = candidateQualification.ULN,
FrameworkID = candidateQualification.FrameworkID,
Achieved = candidateQualification.Achieved,
DateAchieved = candidateQualification.DateAchieved
}).ToList();
List<CandidateExtended> candidateVM = new List<CandidateExtended>();
foreach (var item in awardDetails)
{
CandidateExtended vm = new CandidateExtended();
vm.AwardID = item.AwardID;
vm.FrameworkID = item.FrameworkID;
vm.ULN = item.ULN;
vm.Forename = item.Forename;
vm.Surname = item.Surname;
vm.DOB = item.DOB;
vm.TitleShort = item.TitleShort;
vm.TitleFull = item.TitleFull;
vm.Award = item.Award;
vm.AwardLevel = item.AwardLevel;
vm.Status = item.AwardStatus;
vm.Completion = item.Completion;
vm.SelectedRoute = item.SelectedRoute;
foreach (var qualification in qualificationDetails)
{
if (qualification.ULN == item.ULN && qualification.FrameworkID == item.FrameworkID)
{
vm.addQualification(qualification);
}
}
candidateVM.Add(vm);
}
return View(candidateVM);
}
Ansicht
@model List<Apprenticeship_SingleAward.ViewModels.CandidateExtended>
@{
ViewBag.Title = "Single Award Apprenticeships";
Layout = "~/Views/Shared/_Organisation.cshtml";
}
<div class="application-table table-responsive">
<table class="table table-striped administration-table">
<thead>
<tr class="admin-table-heading">
<th>ULN</th>
<th>First Name</th>
<th>Last Name</th>
<th>Title</th>
<th>Award</th>
<th>Level</th>
<th>Qualifications</th>
<th>Status</th>
</tr>
</thead>
<tbody>
@for (int j = 0; j < Model.Count(); j++)
{
var award = Model[j];
<tr>
<td>@award.ULN</td>
<td>@award.Forename</td>
<td>@award.Surname</td>
<td>@award.TitleShort</td>
<td>@award.Award</td>
<td>@award.AwardLevel</td>
<td>
<button class="btn qualificationbutton" data-toggle="modal" data-target="#@qualificationModal">@displayQualTotal<i class="glyphicon glyphicon-pencil org-edit-icon"></i></button>
@using (Html.BeginForm("UpdateAward", "Organisation", FormMethod.Post, new { id = award.AwardID}))
{
@Html.HiddenFor(a => Model[j].AwardID)
<div id="@qualificationModal" class="modal fade" role="dialog">
<div class="modal-dialog organisationmodal">
<div class="modal-content">
<div class="modal-body">
<h4 class="org-modal-subheading">@award.TitleShort</h4>
<br />
<div class="row">
<div class="col-md-12">
<div class="row org-row-main">
<div class="col-md-7"><h4 class="org-type">Qualification</h4></div>
<div class="col-md-2"><h5 class="org-completed">Completed</h5></div>
<div class="col-md-3"><h5 class="org-date">Date</h5></div>
</div>
<hr class="org-hr"/>
@for (int i = 0; i < Model[j].Qualifications.Count(); i++)
{
<div class="row org-row">
<div class="col-md-7">
@Html.HiddenFor(a => Model[j].Qualifications[i].ID)
</div>
<div class="col-md-2">
@Html.CheckBoxFor(a => Model[j].Qualifications[i].Achieved)
</div>
<div class="col-md-3"
>@Html.TextBoxFor(a => Model[j].Qualifications[i].DateAchieved, "{0:dd/MM/yyyy}")
</div>
</div>
}
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn ccea-signout" data-dismiss="modal">Close</button>
<button type="submit" class="btn admin-button" style="margin-top: 0;">Save</button>
</div>
</div>
</div>
</div>
}
</td>
<td>
@{
var status = award.Status;
if (status == "In Progress")
{
<button class="btn progressbutton" style="margin: 0;">@status</button>
}
}
</td>
</tr>
}
</tbody>
</table>
UpdateAward
[HttpPost]
public ActionResult UpdateAward(List<CandidateExtended> Model)
{
return RedirectToAction("Index", "Login");
}
"Aber auf dem Post der Daten wird nur mein erster Preis in meinem Controller binden" - Da Sie einen Award zu einem Zeitpunkt veröffentlichen, verstehe ich diese Aussage nicht. –
Ja, ich poste jeweils einen Award. Der erste Preis, der auf der Seite angezeigt wird, wird gutgeschrieben und gebunden, wenn ich ihn teste. Wenn ich danach jedoch einen der anderen Auszeichnungen ausprobiere, die angezeigt werden, binden sie sich nicht und sind in VS null. @RyanSearle –
Schauen Sie sich an, was an Ihre Anwendung gesendet wird. In Chrome offene Entwickler-Tools, auf der Registerkarte Netzwerk finden Sie Ihre Anfrage und fügen Sie die Ergebnisse in Ihrer Antwort, wenn Sie müssen. –