2017-11-03 4 views
0

본인에게는 여러 가지 수상 경력이 있으며 각 수상 내역에는 해당하는 자격 목록이 있습니다. 각 상을 표시하기 위해 ViewModel을 만들었으며 버튼을 클릭하면 모달이 관련 자격으로 표시되고 사용자가 완료/업데이트 한 것으로 표시 할 수 있습니다. 그러나 데이터의 게시물에만 내 첫 번째 수상 내 컨트롤러 메서드에서 바인딩됩니다. 내가 VS에서 디버깅 할 때 나머지는 Null로 컴백합니다. 데이터는 내보기에 예상대로 표시되며 각 수상은 관련 자격 만 표시합니다. 이를 도와 주신 것에 미리 감사드립니다.C# MVC ViewModel 게시 된 결과 1 개가 null 인 경우 기타

뷰 모델

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

컨트롤러

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

보기

@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

"그러나 데이터 첫 번째 보너스 만 내 컨트롤러에서 바인딩됩니다"- 한 번에 하나의 보너스를 게시하므로이 진술을 이해할 수 없습니다. –

+0

예 한 번에 한 보너스를 게시합니다. 페이지에 표시된 첫 번째 시상은 잘 게시되고 테스트 할 때 바인딩됩니다. 그러나 이후에 내가 표시되는 다른 상을 시도 할 때 게시 할 때 그들은 바인딩되지 않으며 VS에서 null입니다. @RyanSearle –

+0

신청서에 무엇이 보내어 지는지 살펴보십시오. Chrome 공개 개발자 도구의 경우 네트워크 탭에서 요청을 찾아 필요한 경우 답변을 붙여 넣습니다. –

답변

1

지금 설정 방법 (BeginForm@for 내부, 그리고 모든 'mini'-양식에 대한 제출 버튼을 포함), 모든이 포함 된 양식 포스트를 할 것입니다 제출 목록에서 정확히 하나의 항목.

한 번에 하나의 항목을 편집하는 방식이라면 그대로 사용해도됩니다. 그러나 포스트 액션 메소드가 준비 일 때 목록을 수신해도 각 '미니'양식에 단 하나의 항목 만 있기 때문에 목록에 여러 항목이 존재하지 않는다는 점에 유의하십시오 (덧글 추가).

당신이 BeginForm 외부 @for를 이동 한 후, 한 번에 여러 항목을 저장하고 사용할 수 있도록하려는 반면에 경우 하나의 형식, 예를 들어 말에 버튼을 제출 마감 직전에 }.

+0

예, 그것이 내가 원하는 방식입니다. 사용자가 한 번에 하나씩 편집 한 다음 '미니 양식'을 제출하기를 원합니다. 그들이보기에 사용자에게 보여지는 상 중 하나에 대해 분당 6 개의 상을 수여하고 있지만, 다른 상/미니 양식을 제출하기를 원한다면 null 모델. 각각의 수상 및 테스트를 마쳤습니다. 게시 될 때 하나만 바인딩됩니다. 내 데이터를 삭제하고 다시 입력하여 영향을 미치지 않았는지 확인했지만 동일한 동작이 다시 발생합니다. –

+0

단일 항목 양식을 원한다는 것을 몰랐습니다. 그렇지 않으면 목록을 사용하기 위해 변경을 제안하지 않았을 것입니다. List *와 함께 * 작업하게 만들려면 각 양식에 인덱스가있는 더미 항목을 추가해야하므로 각 양식에 사용 된 색인은 항상 편집중인 항목의 색인까지 0에서 시작됩니다. 더 깔끔한 대안은 목록 사용을 중지하는 것입니다. 즉, 각 양식 내의 색인이 아닌 Model 항목으로 돌아가서 Post Action Method에서 Qualification_Extended를 사용하는 것입니다. –

+0

프런트 엔드 개발자의 요구 사항은 동일한 페이지에서 여러 양식을 사용하는 것이 었습니다. 그러나 그것이 주어진 문제로 인해 나는 각 후보자를위한 하나의 형식으로 새로운 견해로가는 것에 대해 이야기했다. 지난 며칠 동안 조언 해 주셔서 감사합니다. –