2012-03-01 3 views
1

Я пытаюсь реализовать обнаружение конфликтов в системе администратора, то есть Алиса редактирует страницу; Боб редактирует одну и ту же страницу и сохраняет ее до Алисы. Чтобы Алиса не переписала изменения Боба, мне нужно сообщить ей, что произошло изменение, и точные поля, которые она переписала бы и что Боб спас их. (Все это использует SQL).Обнаружение конфликтов ASP.NET в системе администратора

Я попытался хранить объект, связанный с Page_Load, но это исчезает, когда страница отправляется назад. Есть ли способ сохранить объект, не выписывая неприятный код сериализации? Или действительно лучший способ сделать это.

ответ

2

Если объект не очень сложный, просто отметьте его как [Serializable] и засуньте его в ViewState или SessionState, после чего он выдержит postbacks (хотя, если вы поместите его в ViewState, вам нужно вернуть его в viewstate после postback, перед тем, как страница будет отображаться снова).

Другой вариант, если объект немного сложный, или вы действительно не хотите сохранять эти данные, убедитесь, что в рассматриваемой таблице есть поля вдоль линий LastUpdated и LastUpdatedBy, и убедитесь, что они записываются в любое время он обновляется. Тогда, что вы можете сделать, это когда вы просматриваете страницу Алисы, выпишите дату LastUpdated в скрытое поле (или viewstate).

Затем при попытке сохранения сравните запись в базе данных LastUpdated с той, которая была прикреплена при визуализации страницы. Если они совпадают, продолжайте и выполните обновление. Если они отличаются друг от друга, у вас есть значения, которые Алиса хотела ввести, путем их передачи из обратной передачи, и у вас есть изменения Боба, начиная с проверки даты. Затем вы можете отобразить любой пользовательский интерфейс, который вы хотите от него.

EDIT: Некоторые другие параметры, если вы хотите показать исходные значения, которые Алиса имела при загрузке страницы.

Первая, самая низкая технология - это иметь HiddenField, соответствующий каждому редактируемому полю. Вы загружаете их одновременно с заполнением элементов управления, а затем используйте их для отображения исходных значений.

Другой вариант, если вы используете ObjectDataSource будет использовать это ConflictDetection особенность: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.conflictdetection.aspx

Между этим и свойством OldValuesParameterFormatString, контроль будет проходить исходные значения функции Update, а также обновленные значения.

+0

Спасибо за ответ, мне нравится последний обновленный вариант (можно ли использовать TimeStamp таким же образом?), Но это затрудняет понимание того, какие поля Боба отличаются от значений, которые сначала загрузили Алиса. Есть идеи? Я действительно не хочу использовать Serializable, потому что я буду делать это на нескольких объектах, и это не очень легко обслуживается. –

+0

См. Править для получения дополнительной информации. –

+0

спасибо за ваши идеи, отличная помощь –

Смежные вопросы