>

더 명확하게하기 위해 글을 다시 쓰고 있습니다

다음과 같은 행동을하는 HomeController가 있습니다

public ActionResult About()
    {
        MapDetailsRepository repMapDetail = new MapDetailsRepository("name=ge");
        YearRepository repYear = new YearRepository("name=ge");

        SuperMapModel smM = new SuperMapModel();
        smM.saVM = new StudentAssessmentViewModel();
        MapDetailResultSet mapDetailResultSet = repMapDetail.GetMapDetails(53);
        smM.saVM.mapDetails = mapDetailResultSet.mapDetails.ToList();
        smM.saVM.results = mapDetailResultSet.results.ToList();
        smM.saVM.students = mapDetailResultSet.students.ToList();
        smM.scM = new SearchControlViewModel();
        smM.scM.YearList = new SelectList(repYear.GetAll(), "yearID", "year");

        return View(smM);        }
public ActionResult DisplaySearchResults(string searchText) {
         MapDetailsRepository repMapDetail = new MapDetailsRepository("name=ge");
         SuperMapModel smM = new SuperMapModel();
        smM.saVM = new StudentAssessmentViewModel();
        MapDetailResultSet mapDetailResultSet = repMapDetail.GetMapDetails(22);
        smM.saVM.mapDetails = mapDetailResultSet.mapDetails.ToList();
        smM.saVM.results = mapDetailResultSet.results.ToList();
        smM.saVM.students = mapDetailResultSet.students.ToList();
        return PartialView("~/Views/Maps/_MapDetailsList.cshtml", smM.saVM);
}

SuperMapModel은 2 개의 뷰 모델이있는 수퍼 클래스입니다 -검색 패널 부분 제어를위한 scM -MapDetailList 부분 제어용 saVM

페이지로드시 SuperMapModel은 각 모델을 각 부분 제어에 전달하는보기로 전달됩니다

<div>
@Html.Partial("_SearchPanel", Model.scM)
</div>
<div class="row">
<div class="col-md-12 table-responsive" >
        @Html.Partial("~/Views/Maps/_MapDetailsList.cshtml", Model.saVM)
</div>

내 MapDetails PArtial Control은 매우 복잡하므로 제거 된 버전을 제공합니다

<table>
    <thead>
        <tr><th/><th/><th/></tr>
        <tr><th/><th/><th/></tr>
    </thead>
    <tbody>
      @foreach(ShortStudent geStudent in Model.students)
     {  
        <tr>
           <td>@geStudent.firstname</td>
           foreach (run it x number of times)
            {
               <td>
                   @foreach (ShortResult geResult in Model.results)
                   {
                   if (geResult.ResultValue != null)
                                {
                                    <script>{ setResultValue(@colIndex, @rowIndex, '@geResult.ResultValue'); }</script>
                                }
                      }
               </td>
           }
       </tr>
      }
    </tbody>
</table>

이 setResultValue 함수는 기본보기 (정보)에 정의되어 있으며 현재 td의 innerhtml을 설정합니다.

function setResultValue(colIndex, rowIndex, resultValue) {
    alert("inside about");
    var cell = $("#MapDetails").children().children()[rowIndex].children[colIndex];
    cell.innerHTML = resultValue;
}

P.S. 이 격자는 document.ready에서 검도 격자로 변환됩니다

이제 페이지로드에서 완벽하게 작동하지만 검색 패널 내부에서 검색 버튼을 클릭하면 다음을 수행합니다 (검색 패널 부분 제어에서 정의)

function refreshGrid() {
    alert("search panel");
    var url = '@Url.Action("DisplaySearchResults", "Home")';
    $("#MapDetails").load(url, { searchText: "Lee" }, function () {
        alert("success");
    });
}

P.S. 콜백은 절대로 해고되지 않습니다

이제DisplaySearchResults

의 새 데이터로 부분 뷰만 바인딩합니다.

이제 분명히 메인 페이지에서 setResultValue 스크립트 함수를 찾을 수 없으므로 부분보기 mapdetailslist (동시에 나쁜 습관 임)에서 동일한 스크립트 함수 setResultValue를 복제했습니다.

업데이트

디버깅 후 더 자세한 정보를 얻었으므로 이제 새로운 문제는 페이지로드에 있습니다. $( "# MapDetails"). children (). children () [rowIndex] 버튼 클릭 후 동일하게 정의되지 않음

  • 답변 # 1

    그래서 문제는 다음 코드로 td 요소를 얻을 수 없다는 것입니다.

    $("#MapDetails").children().children()[rowIndex]
    
    

    매우 해키 한 방법으로 해결했지만 더 깔끔한 솔루션을 원합니다

    function setResultValue(colIndex, rowIndex, resultValue) {
    if ($("#MapDetails").children().children()[rowIndex] != undefined) {
        var cell = $("#MapDetails").children().children()[rowIndex].children[colIndex];
        cell.innerHTML = resultValue;
    }
    else {
        var newRow = 0, newCol = 0, assessmentLength = 5, elementPos = 0;
        newRow = rowIndex - 3;
        newCol = colIndex - 4;
        elementPos = (newRow * assessmentLength) + newCol;
        $(".test").get(elementPos).innerHTML = resultValue;
    }
    }
    
    

    .test는 마크 업에서 볼 수 있듯이 내 td의 클래스입니다

    부분 뷰 렌더링이 여전히 존재하는 경우 스크립트 요소 및 dom 요소를로드하는 순서에 대한 내 질문

관련 자료

  • 이전 svn - TortoiseSVN을 사용하여 분기 및 병합하는 가장 간단한 방법은 무엇입니까?
  • 다음 survey - USB 드라이브에는 어떤 개발 도구가 있습니까?