К сожалению, это не делает Web-приложение дружественным к пользователю. В частности, это представляет проблему, если запись состоит из нескольких полей или поля содержат детальную информацию, поскольку в таким случае отредактированные изменения просто отбрасываются, заставляя пользователя начинать все сначала.

Лучшее решение — предоставить пользователю возможность выбора. В идеале страница должна показать текущее значение записи (принимая во внимания все последние изменения) и разрешить пользователю применить исходные отредактированные им значения, либо отменить обновление, либо внести дополнительные уточнения и затем подтвердить обновление. На самом деле достаточно легко построить страницу, которая реализует все эти возможности.

Во-первых, начните с DetailsView, который позволяет пользователю редактировать индивидуальные записи из таблицы Shippers базы данных Northwind. (Эту таблицу достаточно легко использовать в стратегии "сравнить все", потому что в ней всего три поля. Более крупные таблицы лучше работают с эквивалентным подходом на основе временных меток.)

Вот сокращенное определение DetailsView, который вам понадобится:

<asp:DetailsView ID="detailsEditing1" runat="server"
  DataKeyNames="ShipperID" AllowPaging="True" AutoGenerateRows="False"
  DataSourceID="sourceShippers" OnItemUpdated="DetailsView1_ItemUpdated" ...>
  <Fields>
    <asp:BoundField DataField="ShipperID" ReadOnly="True" />
    <asp:BoundField DataField="CompanyName" />
    <asp:BoundField DataField="Phone" />
    <asp:CommandField ShowEditButton="True" />
  </Fields>
</asp:DetailsView>

Элемент управления источником данных, привязанный к DetailsView, использует выражение "проверки всех" в операторе UPDATE для реализации строгого параллелизма:

<asp:SqlDataSource ID="sourceShippers" runat="server"
  ConnectionString="<%$ ConnectionStrings:Northwind %>"
  SelectCommand="SELECT * FROM Shippers"
  UpdateCommand="UPDATE Shippers
    SET CompanyName=@CampanyName, Phone=@Phone
    WHERE ShipperID=@original_ShipperID AND
    CompanyName=@original_CompanyName AND
    Phone=@original_Phone"
  ConflictDetection="CompareAllValues">
  <UpdateParameters>
    <asp:Parameter Name="companyName" />
    <asp:Parameter Name="Phone" />
    <asp:Parameter Name="original_ShipperID" />
    <asp:Parameter Name="original_CompanyName" />
    <asp:Parameter Nаmе="оriginal_Рhоne" />
  </UpdateParameters>
</asp:SqlDataSource>

предыдущая    следующая страница    вначало главы    оглавление

477

Hosted by uCoz