2017-12-20 3 views
1

Ich mache eine Teilnahme-Panel für die Schüler, die in der jeweiligen Charge eingeschrieben sind. Dafür zeige ich die Aufzeichnungen der Schüler zusammen mit der Anzahl der Checkboxen entsprechend der Anzahl der Klassen an, die für diese Charge zugewiesen wurden. Alles wird korrekt angezeigt, aber die Kontrollkästchen nur einer Zeile enthalten Werte für den Post, und die restlichen Kontrollkästchen in anderen Zeilen werden nicht gepostet. Die Studentendetails für jede Zeile werden in einer Liste korrigiert.CheckBox Liste Artikel nicht in MVC 5

Unten ist mein Code

StudentAttendance.cs

public class StudentAttendance 
    { 
     public List<Models.User> userlist { get; set; } 
     public List<Models.Days> days { get; set; } 
    } 

InstructorController.cs

public ActionResult AssignedStudents(string id) 
     { 
      Models.StudentAttendance viewmodel = new Models.StudentAttendance(); 
      //viewmodel.studentbatch = new Models.StudentBatch(); 
      //viewmodel.user = new Models.User(); 

      Context.Instructor instructor = new Context.Instructor(); 

      viewmodel.userlist = new List<Models.User>(); 
      viewmodel.days = new List<Models.Days>(); 
      viewmodel.userlist = instructor.lstAssignedStudents(id); 

      Context.Batches contBatch = new Context.Batches(); 
      var days = contBatch.SelectDays(id); 
      int totaldays = contBatch.CalculateDays(days); 

      var duration = contBatch.GetallBatchList().Where(p => p.Id == id); 
      var batchduration = (from c in duration where c.Id == id select c.Duration).ToList(); 
      string d = batchduration[0].ToString(); 

      int totalduration = contBatch.GetBatchDuration(d); 

      int TotalCheckBoxes = totalduration * totaldays; 

      List<string> getdays = contBatch.getdaysinList(days, totalduration); 
      List<Models.Days> day = new List<Models.Days>(); 

      for (int i = 0; i < TotalCheckBoxes; i++) 
      { 
       day.Add(new Models.Days { dayid = i, dayname = getdays[i], ischecked = false }); 

      } 

      viewmodel.days = day; 

      return View(viewmodel); 
     } 

[HttpPost] 
     public ActionResult MarkAttendance(Models.StudentAttendance viewmodel) 
     { 
      Models.StudentAttendance viewmodel1 = new Models.StudentAttendance(); 
      //viewmodel.studentbatch = new Models.StudentBatch(); 
      //viewmodel.user = new Models.User(); 
      return View(); 
     } 

AssignedStudents.cshtml

@model WebApplication1.Models.StudentAttendance 

@{ 
    ViewBag.Title = "AssignedStudents"; 
} 

<h2>AssignedStudents</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 

@using (Html.BeginForm("MarkAttendance","Instructor", FormMethod.Post)) 
{ 
<table class="table"> 
    <tr> 

     <th>@Html.DisplayName("First Name")</th> 
     <th>@Html.DisplayName("Last Name")</th> 
    </tr> 

@for (int j = 0; j < Model.userlist.Count; j++) 
{ 

    <tr> 
     <td>@Html.HiddenFor(m=>Model.userlist[j].Id)</td> 
     <td>@Html.EditorFor(m => Model.userlist[j].FirstName)</td> 
     <td>@Html.EditorFor(m => Model.userlist[j].LastName)</td> 
     @for (int i = 0; i < Model.days.Count; i++) 
     { 
      <td> 
       @Html.CheckBoxFor(m => Model.days[i].ischecked) 
       @Model.days[i].dayname 
       @Html.HiddenFor(m => Model.days[i].dayid) 
       @Html.HiddenFor(m => m.days[i].dayname) 
      </td> 
     } 
    </tr> 
} 
</table> 

<div class="form-group"> 
    <div class="col-md-offset-2 col-md-10"> 
     <input type="submit" id="Attendance" value="Create" class="btn btn-default" /> 
    </div> 
</div> 


} 
+0

Sie erstellen nur doppelte Checkboxen, mit doppelten 'name' Attributen (und doppelte' id' Attribute, die in HTML ungültig sind). Der 'DefaultModelBinder' bindet nur den ersten passenden Namen. Es ist nicht klar, was Sie erreichen möchten. Sollte jeder "Benutzer" eine Sammlung von "Days" haben? (In diesem Fall ist Ihr Modell falsch) –

+0

Ja, jeder Benutzer hat eine Sammlung von Tagen. – user100020

+0

Dann brauchen Sie ein View-Modell für einen Benutzer (Student?), Der eine Collection-Eigenschaft für die Tage enthält und dann verschachtelte 'for'-Loops verwendet –

Antwort

0

Das Problem mit Viewmodel als Liste in der Controller-Klasse behoben.

StudentAttendance.cs

List<DayVM> days = new List<DayVM> 
{ 
    new DayVM(), 
    new DayVM() 
}; 

List<StudentVM> model = new List<StudentVM> 
{ 
    new StudentVM{ Id = 1, FirstName = "Bob", Days = days }, 
    new StudentVM{ Id = 2, FirstName = "john", Days = days }, 
} 
return View(model); 

und Innenansicht

@for(int i = 0; i < Model.Count; i++) 
{ 
    ... elements for properties of Student 
    @for(int j = 0; j < Model[i].Days.Count; j++) 
    { 
     @Html.CheckBoxFor(m => m[i].Days[j].IsSelected) 
     .... 
    } 
} 

und Liste nehmen für Werte in der Post Aktion

public ActionResult MarkAttendance(List<Models.StudentVM> lst) 
{ 
..... 
} 

Alle dank Stephen Muecke zu sammeln, die aus es einfach.