2017-12-20 14 views
1

특정 배치에 등록한 학생을위한 출석 패널을 만들고 있습니다. 이를 위해 나는 해당 배치에 할당 된 클래스 수에 따라 확인란의 수와 함께 학생들의 기록을 표시합니다. 모든 것이 올바르게 표시되지만 한 행만의 확인란은 값을 게시물에 전달하고 다른 행의 나머지 확인란은 게시되지 않습니다. 각 행에 대한 학생 세부 정보가 목록에 수정 게시 중입니다. 다음은 CheckBox 목록 항목이 mvc에 게시되지 않음 5

내 코드입니다

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

중복 된'name' 속성 (중복 된'id' 속성은 잘못된 html 임)으로 중복 체크 박스를 만드는 것입니다. DefaultModelBinder는 첫 번째로 일치하는 이름 만 바인딩합니다. 당신이 달성하기를 원하는 것이 명확하지 않습니다. 각'User'는'Days' 컬렉션을 가져야합니까? (이 경우 모델이 잘못됨) –

+0

예, 각 사용자에게는 일의 컬렉션이 있습니다. – user100020

+0

그러면 요일에 대한 컬렉션 속성이 포함 된 사용자 (학생?)에 대한보기 모델이 필요하며 중첩 된 'for'루프를 사용합니다. –

답변

0

viewmodel을 컨트롤러 클래스의 목록으로 사용하여 문제를 해결했습니다.

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

@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) 
     .... 
    } 
} 

내부 및 사후 조치를 만든 스티븐 뮈크에

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

모든 덕분에 값을 수집 목록을 복용 쉽게.