2014-11-09 7 views
0

SlickGrid를 사용하여 MVS 응용 프로그램을 최적화하려고합니다. 그리드 자체는 500-25,000 행의 어디에서나있을 수 있으며 대략 40 개의 열을가집니다. 그리드 자체는 훌륭하게 작동하지만 변경된 데이터를 내 컨트롤러에 게시하여 SQL 측 테이블을 업데이트하는 데 어려움이 있습니다.Slickgrid를 사용하여 MVC에 큰 변경 집합 게시

저축 문제는 MVC의 POST 제한 때문에 발생합니다. 내 web.config에서 maxAllowedLengths를 편집하고 막 시도했습니다. 그러나 무한한 양의 데이터를 게시 할 수 있다고하더라도 더 어렵지 않게 더 똑똑하게 일할 수 있다고 생각합니다.

는 여기에 현재 데이터를 저장하는 방법을 보여주기 위해 몇 가지 시도 사이비 코드입니다 :

function Save(data) 
{ 
    var changedData = []; 
    for(i = 0; i < data.length, i++) { 
     if(data[i].isChanged == 1) 
     { 
     changedData.push(data[i]); 
     //this array of changed objects only contains 
     //propertys/columns that actually can be changed. About 30 in total. 
     } 
    } 
    //I can currently POST a little more than 5000 rows, anything else and I get a 500 error due 
    //do the size of my JSON string. 
    if (changedData.length < 5000) 
    { 
      $.ajax({ 
      type: "POST", 
      url: url, 
      data: JSON.stringify(changedData), 
      success: success 
      }); 
    }else 
    { 
    //break changedData into chunks of 5000 and loop through the ajax call. 
    } 
} 

가 여기에 변경 사항을 저장하려고 해요 방법은 다음과 같습니다. 여기에는 변경 사항을 대기열에 저장하고 컨트롤러로 전송 한 다음 데이터 서버 측에서 순차적으로 실행합니다.

var pendingChanges = []; 
    function Save(data) 
    {   
     //I would like to be able to do this in one go instead of chunking out the changes 
     //and finding a way to store them server side before aggregating and running them. 
      $.ajax({ 
      type: "POST", 
      url: url, 
      data: JSON.stringify(pendingChanges), 
      success: success 
      }); 
    } 

    grid.OnCellChange(....) 
    { 
    //Update data in cell 
    pendingChanges.push(ID:item.id, Property:xxx,Value:item.value,TimeStamp:now); 
    } 

    function massCellChange() 
    { 
    var changedRows = []; 
    for (i = 0; i < data.length; i++;) 
    { 
     if (slickGridDataViewContainsThisItem) 
     { 
      changedRows.push(data[i].ID); 
      //Update slickgrid 
     } 
    } 
     pendingChanges.push(ID:[changedRows],Property:xxx,Value:item.value,TimeStamp:now); 
    } 

컨트롤러 측에서 실제로 방법으로 만들 수있는 한 아무런 문제가 없습니다. 여기서 JavaScriptSerializer를 사용하거나 JSONConvert를 사용하여 내 모델로 변경 집합을 분리합니다.

큰 변경 집합을 저장하는 데 사용할 수있는 다른 패턴도 완전히 열려 있습니다. 한 번에 전체 표를 편집 할 수있는 기능이 있지만, 현재 dataView에 표시된 항목 만 편집 할 수 있기 때문에 단일 사용자가 생성 할 수있는 변경 사항의 수는 상당히 클 수 있습니다. 그 글로벌 명령을 보류중인 단일 변경 사항으로 보내고 싶지만 변경을 실행했을 때 어떤 행이 보이는지 POST하는 우아한 방법을 찾지 못했습니다. (ID : 속성을 ID 배열로 설정하면 작동하지 않습니다. POST 제한과 동일한 문제가 발생합니다.)

감사합니다!

+0

당신의 솔루션은 괜찮아 보입니다. 길이 제한을 없애는 방법이 있다고 확신합니다. 어쩌면이 대답이 당신을 위해 일할 수도 있습니다. Json 데이터의 메가 바이트를 전송하는 프로젝트에서 도움이되었습니다. http://stackoverflow.com/questions/15788342/net-mvc-4-json-post-put-char-limit-in-web-config – Preli

답변

0

잠시 시간이 지났으므로 해결 방법을 게시 할 것입니다. 사용자가 "저장"을 클릭 한 후에 많은 작업을 게시하려고 시도하는 대신 자동 저장을 사용하여 작업을 중단했습니다. 기본적으로 사용자가 편집을 할 때마다 열 이름, rowid 및 새 값이있는 객체를 배열로 푸시합니다. 자동 저장이 시작되면 각 셀의 최신 값만 가져 와서 변경 대기열을 실행합니다. 충분히 단순하고 보람있는 순간과 같습니다. 이렇게하면 내 앱의 응답 시간이 향상되었습니다. 사용자는 작업이 끝날 때가 아니라 지속적으로 작업을 저장하는 것이 더 행복했습니다.

단순화 된 열 rowIDs, 새로운 값을 보내면 많은 정보를 줄일 수있었습니다. 내 중간 엔드의 개체를 다시 작성하여 데이터베이스를 업데이트하기 위해 변경 사항의 "스크립트"를 실행할 수 있다고 생각합니다.