2012-03-01 3 views
1

관리자 시스템에서 충돌 검색을 구현하려고합니다. 즉 Alice가 페이지를 편집하고 있습니다. Bob은 같은 페이지를 편집하여 Alice 앞에 저장합니다. 앨리스가 밥의 변경 사항을 덮어 쓰지 않도록하려면 변경 사항이 발생했으며 정확한 필드는 겹쳐 쓰고 밥이 저장 한 필드는 알게해야합니다. (이것은 모두 SQL을 사용하는 것입니다.)Admin System에서 ASP.NET 충돌 감지

관련 개체를 Page_Load에 저장하려고했지만이 페이지가 게시 될 때 사라집니다. 불쾌한 직렬화 코드를 작성하지 않고도 객체를 영속화 할 수있는 방법이 있습니까? 또는 실제로 그것을하는 더 좋은 방법.

답변

2

객체가 매우 복잡하지 않은 경우 [Serializable]으로 표시하고 ViewState 또는 SessionState로 이동하면 다시 게시 될 수 있습니다 (ViewState에 넣은 경우에는 해당 객체를 다시 viewstate에 넣어야하지만 다시 페이지가 렌더링되기 전에 다시 게시).

개체가 약간 복잡하거나 실제로 해당 데이터를 저장하지 않으려는 경우 문제의 테이블에 LastUpdated 및 LastUpdatedBy 행에 필드가 있는지 확인하고 해당 테이블에 언제든지 기록되도록하십시오. 업데이트됩니다. 그런 다음 Alice 페이지를 렌더링하고 LastUpdated 날짜를 숨겨진 필드 (또는 viewstate)에 기록합니다.

그런 다음 시도한 저장시 데이터베이스의 LastUpdated에있는 레코드를 페이지 렌더링시 첨부 된 레코드와 비교하십시오. 동일하면 진행하여 업데이트하십시오. 이들이 다르다면 앨리스가 포스트 백에서 가져 왔던 방식으로 앨리스가 입력하고 싶었던 값이 있으며 날짜 확인을 수행하는 것에서 밥의 변경 사항을 얻었습니다. 그런 다음 원하는 모든 UI를 표시 할 수 있습니다.

편집 : 페이지를로드 할 때 앨리스가 가져온 원래 값을 표시하려면 다른 옵션을 사용하십시오.

첫 번째, 최하위 기술자는 편집 가능한 각 필드에 해당하는 HiddenField를 갖는 것입니다. 컨트롤을 채우는 것과 동시에로드 한 다음 원래 값을 표시하는 데 사용합니다.

또 다른 옵션은, 당신이 그것을 사용하는 것입니다 ObjectDataSource를를 사용하는 경우 것은 ConflictDetection 기능이다 : 이것과 OldValuesParameterFormatString 속성 사이 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.conflictdetection.aspx

, 다음 업데이트 기능으로 원래의 값을 전달할뿐만 아니라 것이다 제어 갱신 된 값

+0

답장을 보내 주셔서 감사합니다. 마지막으로 업데이트 된 옵션 (TimeStamp를 같은 방식으로 사용할 수 있습니까?)이 마음에 들지만 Bob의 필드 중 Alice가 처음로드 한 값과 다른 필드가 있는지 알기 어렵습니다. 어떤 아이디어? 많은 객체에서이 작업을 수행하고 유지 관리가 쉽지 않기 때문에 Serializable을 사용하고 싶지 않습니다. –

+0

자세한 내용은 편집을 참조하십시오. –

+0

당신의 아이디어, 큰 도움을 주셔서 감사합니다 –