2017-11-03 2 views
0

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"); 

} 
+0

"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. –

+0

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 –

+0

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. –

Antwort

1

So wie es jetzt eingerichtet ist (mit BeginForminnerhalb der @for und eine Submit-Button für jede ‚mini'-Form), gibt jeder ein Formular Beitrag tun enthält genau ein Gegenstand von der Liste.

Wenn Sie möchten, dass es funktioniert (bearbeiten Sie jeweils ein Element), können Sie es behalten. Bedenken Sie jedoch (fügen Sie einen Kommentar hinzu?), Dass, obwohl die Post-Aktion-Methode ist bereit eine Liste zu erhalten, es wird nie mehrere Elemente in der Liste sein, da jedes 'Mini'-Formular nur ein Element enthält.

Wenn auf der anderen Seite Sie wollen auf einmal mehrere Artikel speichern zu können, dann bewegen Sie die BeginFormaußerhalb der @for, und verwenden Sie einen Submit nur Button am Ende des Formulars, z.B. kurz vor dem Schließen }.

+0

Ja, das ist, wie ich will, dass es funktioniert.Ich möchte, dass der Benutzer einen nach dem anderen bearbeitet und dann das 'Mini-Formular' abschickt. wenn sie damit zufrieden sind.In der Minute arbeitet dies für einen der Preise, die dem Benutzer auf der Ansicht gezeigt werden, es gibt 6 Auszeichnungen.Wenn sie jedoch andere Prämien/"Mini-Formulare" einreichen wollen, wird es eine zurückgeben null Modell Ich habe jede der Auszeichnungen getestet und Nur einer wird gebunden, wenn er zurückgeschickt wird. Ich löschte meine Daten und gab sie erneut ein, um sicherzustellen, dass nichts das beeinflusste, aber ich wiederhole das gleiche Verhalten. –

+0

Ich habe nicht realisiert, dass Sie Einzelformulare wollten, sonst hätte ich nicht vorgeschlagen, dass Sie diese Änderung vornehmen (um eine Liste zu verwenden). Um es mit der List * funktionieren zu lassen, müssen Sie wahrscheinlich Dummy-Elemente mit Indizes in jedes Formular einfügen, so dass die in den einzelnen Formularen verwendeten Indizes immer bei Null beginnen, bis zum Index des Elements, das Sie bearbeiten. Die sauberere Alternative besteht darin, die Verwendung einer Liste zu beenden, dh in jedem Formular zu einem nicht indizierten Modellelement zurückzukehren und Qualification_Extended in der Post-Aktionsmethode zu verwenden. –

+0

Ja, es war eine Anforderung vom Front-End-Entwickler, mehrere Formulare auf derselben Seite zu haben. Aufgrund der Probleme, die es gegeben hat, habe ich ihn überredet, mit einem einzigen Formular für jeden Kandidaten eine neue Sichtweise zu verfolgen. Danke für deinen Rat in den letzten Tagen. –