Udostępnij za pomocą


Aktualizowanie i usuwanie istniejących danych binarnych (VB)

Autor : Scott Mitchell

Pobierz plik PDF

We wcześniejszych samouczkach pokazano, jak kontrolka GridView ułatwia edytowanie i usuwanie danych tekstowych. W tym samouczku zobaczymy, jak kontrolka GridView umożliwia również edytowanie i usuwanie danych binarnych, niezależnie od tego, czy dane binarne są zapisywane w bazie danych, czy przechowywane w systemie plików.

Wprowadzenie

W ciągu ostatnich trzech samouczków dodaliśmy sporo funkcji do pracy z danymi binarnymi. Zaczęliśmy od dodania BrochurePath kolumny do Categories tabeli i odpowiednio zaktualizowaliśmy architekturę. Dodaliśmy również metody warstwy dostępu do danych i warstwy logiki biznesowej, aby pracować z istniejącą Picture kolumną tabeli Categories, która przechowuje zawartość binarną pliku obrazu. Utworzyliśmy strony internetowe, aby przedstawić dane binarne w siatce GridView, zapewniając jednocześnie link do pobrania broszury, z obrazem kategorii pokazanym w elemencie <img>. Dodatkowo, dodaliśmy element DetailsView, aby umożliwić użytkownikom dodawanie nowej kategorii oraz przesyłanie jej broszury i danych obrazów.

Wszystko, co należy zaimplementować, to możliwość edytowania i usuwania istniejących kategorii, które wykonamy w tym samouczku przy użyciu wbudowanego edytowania i usuwania funkcji gridView. Podczas edytowania kategorii użytkownik będzie mógł opcjonalnie załadować nowy obraz lub pozostawić kategorię używającą istniejącego. W przypadku broszury mają do wyboru użycie istniejącej broszury, przesłanie nowej broszury lub zadeklarowanie, że kategoria nie ma już skojarzonej z nią broszury. Zacznijmy!

Krok 1. Aktualizowanie warstwy dostępu do danych

Funkcja DAL ma automatycznie generowane Insert, Update oraz Delete metody, jednakże metody te zostały wygenerowane na podstawie CategoriesTableAdapter głównego zapytania, które nie zawiera kolumny Picture. W związku z tym metody Insert i Update nie zawierają parametrów do określania danych binarnych dla obrazu kategorii. Podobnie jak w poprzednim samouczku, musimy utworzyć nową metodę TableAdapter do aktualizowania Categories tabeli podczas określania danych binarnych.

Otwórz typowany zestaw danych, a następnie w Projektancie kliknij prawym przyciskiem myszy na nagłówek CategoriesTableAdapter i wybierz opcję Dodaj zapytanie z menu kontekstowego, aby uruchomić Kreatora konfiguracji kwerendy TableAdapter. Ten kreator rozpoczyna się od pytania, w jaki sposób zapytanie TableAdapter powinno uzyskać dostęp do bazy danych. Wybierz pozycję Użyj instrukcji SQL i kliknij przycisk Dalej. W następnym kroku zostanie wyświetlony monit o wygenerowanie typu zapytania. Ponieważ tworzysz zapytanie w celu dodania nowego rekordu Categories do tabeli, wybierz pozycję AKTUALIZUJ i kliknij przycisk Dalej.

Wybierz opcję AKTUALIZUJ

Rysunek 1. Wybieranie opcji AKTUALIZACJI (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Teraz musimy określić instrukcję UPDATE SQL. Kreator automatycznie sugeruje instrukcję odpowiadającą głównemu zapytaniu TableAdapter'a (które aktualizuje UPDATE wartości, CategoryName i Description). Zmień instrukcję tak, aby kolumna Picture została dołączona wraz z parametrem @Picture w następujący sposób:

UPDATE [Categories] SET 
    [CategoryName] = @CategoryName, 
    [Description] = @Description, 
    [BrochurePath] = @BrochurePath ,
    [Picture] = @Picture
WHERE (([CategoryID] = @Original_CategoryID))

Końcowy ekran kreatora prosi nas o nadanie nazwy nowej metodzie TableAdapter. Wprowadź UpdateWithPicture i kliknij przycisk Zakończ.

Nadaj nowej metodzie TableAdapter nazwę UpdateWithPicture

Rysunek 2. Nadaj nowej metodzie UpdateWithPicture TableAdapter nazwę (kliknij, aby wyświetlić obraz pełnowymiarowy)

Krok 2. Dodawanie metod warstwy logiki biznesowej

Oprócz zaktualizowania DAL, musimy zaktualizować BLL, aby zawierał metody aktualizacji i usuwania kategorii. Są to metody wywoływane z warstwy prezentacji.

Aby usunąć kategorię, możemy użyć metody wygenerowanej CategoriesTableAdapterDelete automatycznie. Dodaj następującą metodę do klasy CategoriesBLL:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Delete, True)> _
Public Function DeleteCategory(ByVal categoryID As Integer) As Boolean
    Dim rowsAffected As Integer = Adapter.Delete(categoryID)
    ' Return true if precisely one row was deleted, otherwise false
    Return rowsAffected = 1
End Function

W tym samouczku utworzymy dwie metody aktualizowania kategorii — jedną, która oczekuje danych obrazu binarnego i wywołuje metodę, którą właśnie dodaliśmy do klasy UpdateWithPicture, oraz drugą, która akceptuje tylko wartości CategoriesTableAdapter, CategoryName i Description i używa automatycznie generowanej instrukcji klasy BrochurePath. Uzasadnieniem użycia dwóch metod jest to, że w niektórych okolicznościach użytkownik może chcieć zaktualizować zdjęcie kategorii wraz z innymi polami, w takim przypadku użytkownik będzie musiał załadować nowe zdjęcie. Dane binarne przesłanego obrazu mogą być następnie używane w instrukcji UPDATE. W innych przypadkach użytkownik może być zainteresowany tylko aktualizowaniem, np. nazwą i opisem. UPDATE Jeśli jednak instrukcja oczekuje również danych binarnych dla Picture kolumny, konieczne będzie podanie tych informacji. Wymagałoby to dodatkowej podróży do bazy danych, aby przywrócić dane obrazu dla edytowanego rekordu. Dlatego potrzebujemy dwóch UPDATE metod. Warstwa logiki biznesowej określi, który z nich ma być używany na podstawie tego, czy dane obrazu są udostępniane podczas aktualizowania kategorii.

Aby to ułatwić, dodaj dwie metody do CategoriesBLL klasy , obie o nazwie UpdateCategory. Pierwszy powinien akceptować trzy String s, tablicę Byte i Integer jako parametry wejściowe; drugi, tylko trzy String s i Integer. Parametry String wejściowe są przeznaczone dla nazwy kategorii, opisu i ścieżki pliku broszury, tablica Byte zawiera binarne dane zdjęcia kategorii, a Integer identyfikuje CategoryID rekordu do aktualizacji. Zwróć uwagę, że pierwsze przeciążenie wywołuje drugą, jeśli przekazana Byte tablica to Nothing:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Update, False)> _
Public Function UpdateCategory(categoryName As String, description As String, _
    brochurePath As String, picture() As Byte, categoryID As Integer) As Boolean
    
    ' If no picture is specified, use other overload
    If picture Is Nothing Then
        Return UpdateCategory(categoryName, description, brochurePath, categoryID)
    End If
    ' Update picture, as well
    Dim rowsAffected As Integer = Adapter.UpdateWithPicture _
        (categoryName, description, brochurePath, picture, categoryID)
    ' Return true if precisely one row was updated, otherwise false
    Return rowsAffected = 1
End Function
<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Update, True)> _
Public Function UpdateCategory(categoryName As String, description As String, _
    brochurePath As String, categoryID As Integer) As Boolean
    Dim rowsAffected As Integer = Adapter.Update _
        (categoryName, description, brochurePath, categoryID)
    ' Return true if precisely one row was updated, otherwise false
    Return rowsAffected = 1
End Function

Krok 3: Kopiowanie funkcjonalności wstawiania i przeglądania

W poprzednim samouczku utworzyliśmy stronę o nazwie UploadInDetailsView.aspx, która wyświetliła wszystkie kategorie w kontrolce GridView i zapewniła kontrolkę DetailsView do dodawania nowych kategorii do systemu. W tym samouczku rozszerzymy element GridView, aby dodać obsługę edytowania i usuwania. Zamiast kontynuować pracę z UploadInDetailsView.aspx, umieśćmy zmiany w tym samouczku na stronie UpdatingAndDeleting.aspx z tego samego folderu ~/BinaryData. Skopiuj i wklej deklaratywne znaczniki i kod z UploadInDetailsView.aspx do UpdatingAndDeleting.aspx.

Zacznij od otwarcia UploadInDetailsView.aspx strony. Skopiuj całą składnię deklaratywną w elemencie <asp:Content>, jak pokazano na rysunku 3. Następnie otwórz UpdatingAndDeleting.aspx i wklej ten znacznik w elemecie <asp:Content> . Podobnie skopiuj kod z klasy code-behind strony UploadInDetailsView.aspx do klasy UpdatingAndDeleting.aspx.

Skopiuj znacznik deklaratywny z UploadInDetailsView.aspx

Rysunek 3. Kopiowanie znaczników deklaratywnych z UploadInDetailsView.aspx (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po skopiowaniu kodu i znaczników deklaratywnych odwiedź stronę UpdatingAndDeleting.aspx. Powinieneś zobaczyć te same dane wyjściowe i mieć takie same wrażenia użytkownika jak na stronę UploadInDetailsView.aspx z poprzedniego samouczka.

Krok 4: Dodawanie funkcji usuwania do ObjectDataSource i GridView

Jak już omówiliśmy w samouczku Omówienie wstawiania, aktualizowania i usuwania danych , funkcja GridView udostępnia wbudowane funkcje usuwania, a te możliwości można włączyć w zaznaczeniu pola wyboru, jeśli bazowe źródło danych siatki obsługuje usuwanie. Obecnie ObjectDataSource, do którego jest powiązany GridView (CategoriesDataSource), nie obsługuje usuwania.

Aby temu zaradzić, kliknij opcję Konfiguruj źródło danych z inteligentnego znacznika ObjectDataSource, aby uruchomić kreatora. Pierwszy ekran pokazuje, że obiekt ObjectDataSource jest skonfigurowany do pracy z klasą CategoriesBLL . Naciśnij przycisk Dalej. Obecnie określono tylko właściwości ObjectDataSource: InsertMethod i SelectMethod. Jednak asystent automatycznie wypełnił listy rozwijane na kartach UPDATE i DELETE odpowiednio metodami UpdateCategory i DeleteCategory Dzieje się tak, ponieważ w klasie CategoriesBLL oznaczyliśmy te metody jako domyślne metody do aktualizowania i usuwania, używając DataObjectMethodAttribute.

Na razie ustaw listę rozwijaną karty UPDATE na (Brak), ale pozostaw listę rozwijaną karty DELETE ustawioną na wartość DeleteCategory. W kroku 6 wrócimy do tego kreatora, aby dodać obsługę aktualizacji.

Konfigurowanie obiektu ObjectDataSource do używania metody DeleteCategory

Rysunek 4. Konfigurowanie obiektu ObjectDataSource do użycia DeleteCategory metody (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Uwaga / Notatka

Po ukończeniu pracy kreatora program Visual Studio może zapytać, czy chcesz odświeżyć pola i klucze, co spowoduje ponowne wygenerowanie pól kontrolek sieci Web danych. Wybierz pozycję Nie, ponieważ wybranie pozycji Tak spowoduje zastąpienie wszelkich dostosowań pól, które mogły zostać wprowadzone.

Źródło ObjectDataSource będzie teraz zawierać wartość dla jego właściwości DeleteMethod, a także wartość dla DeleteParameter. Pamiętaj, że podczas określania metod za pomocą kreatora, program Visual Studio ustawia właściwość OldValuesParameterFormatStringObjectDataSource na original_{0}, co powoduje problemy z wywołaniami metod aktualizacji i usuwania. W związku z tym całkowicie wyczyść tę właściwość lub zresetuj ją do wartości domyślnej . {0} Jeśli musisz odświeżyć pamięć dla tej właściwości ObjectDataSource, zobacz samouczek Omówienie wstawiania, aktualizowania i usuwania danych .

Po zakończeniu pracy kreatora i naprawieniu OldValuesParameterFormatString, deklaratywny znacznik ObjectDataSource powinien wyglądać podobnie do następującego:

<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="{0}" SelectMethod="GetCategories" 
    TypeName="CategoriesBLL" InsertMethod="InsertWithPicture" 
    DeleteMethod="DeleteCategory">
    <InsertParameters>
        <asp:Parameter Name="categoryName" Type="String" />
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="brochurePath" Type="String" />
        <asp:Parameter Name="picture" Type="Object" />
    </InsertParameters>
    <DeleteParameters>
        <asp:Parameter Name="categoryID" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

Po skonfigurowaniu ObjectDataSource, dodaj funkcję usuwania do GridView, zaznaczając pole wyboru 'Włącz usuwanie' z inteligentnego tagu GridView. Spowoduje to dodanie pola commandfield do obiektu GridView, którego ShowDeleteButton właściwość jest ustawiona na True.

Włącz obsługę usuwania w GridView

Rysunek 5. Włączanie obsługi usuwania w widoku GridView (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Pośmiń chwilę na przetestowanie funkcji usuwania. Istnieje klucz obcy między Products tabelą s CategoryID a Categories tabelą s CategoryID, więc otrzymasz wyjątek naruszenia ograniczenia klucza obcego, jeśli spróbujesz usunąć dowolną z pierwszych ośmiu kategorii. Aby przetestować tę funkcjonalność, dodaj nową kategorię, zapewniając zarówno broszurę, jak i obraz. Moja kategoria testowa, pokazana na rysunku 6, zawiera plik broszury testowej o nazwie Test.pdf i obraz testowy. Rysunek 7 przedstawia element GridView po dodaniu kategorii testowej.

Dodawanie kategorii testowej z broszurą i obrazem

Rysunek 6. Dodawanie kategorii testowej z broszurą i obrazem (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po wstawieniu kategorii testowej jest ona wyświetlana w widoku siatki

Rysunek 7: Po wstawieniu kategorii testowej jest wyświetlana w GridView (kliknij, aby wyświetlić pełnowymiarowy obraz)

W programie Visual Studio odśwież Eksplorator rozwiązań. Powinien zostać wyświetlony nowy plik w folderze ~/BrochuresTest.pdf (zobacz Rysunek 8).

Następnie kliknij link Usuń w wierszu Kategoria testu, co wywołuje odświeżenie strony, a metoda CategoriesBLL klasy DeleteCategory zostanie wyzwolona. Spowoduje to wywołanie metody dal s Delete , co spowoduje wysłanie odpowiedniej DELETE instrukcji do bazy danych. Dane są następnie przywracane do kontrolki GridView, a znaczniki są wysyłane z powrotem do klienta z kategorią testową, która nie jest już obecna.

Mimo że przepływ pracy usuwania pomyślnie usunął rekord Kategorii testów z Categories tabeli, nie usunął pliku broszury z systemu plików serwera WWW. Odśwież Eksplorator rozwiązań i zobaczysz, że Test.pdf nadal znajduje się w folderze ~/Brochures .

Plik Test.pdf nie został usunięty z systemu plików serwera sieci Web

Rysunek 8. Plik Test.pdf nie został usunięty z systemu plików serwera sieci Web

Krok 5. Usuwanie pliku broszury usuniętej kategorii

Jedną z wad przechowywania danych binarnych zewnętrznych w bazie danych jest to, że należy wykonać dodatkowe kroki w celu wyczyszczenia tych plików po usunięciu skojarzonego rekordu bazy danych. Komponenty GridView i ObjectDataSource udostępniają zdarzenia wywoływane zarówno przed, jak i po wykonaniu polecenia usuwania. W rzeczywistości musimy utworzyć procedury obsługi zdarzeń zarówno przed, jak i po akcji. Przed usunięciem rekordu Categories musimy określić jego ścieżkę do pliku PDF, ale nie chcemy usuwać pliku PDF przed usunięciem kategorii w przypadku wystąpienia wyjątku i kategoria nie zostanie usunięta.

Zdarzenie RowDeleting GridView jest uruchamiane przed wywołaniem polecenia usunięcia w ObjectDataSource, podczas gdy jego RowDeleted zdarzenie uruchamiane jest po. Utwórz programy obsługi zdarzeń dla tych dwóch zdarzeń przy użyciu następującego kodu:

' A page variable to "remember" the deleted category's BrochurePath value
Private deletedCategorysPdfPath As String = Nothing
Protected Sub Categories_RowDeleting(sender As Object, e As GridViewDeleteEventArgs) _
    Handles Categories.RowDeleting
    
    ' Determine the PDF path for the category being deleted...
    Dim categoryID As Integer = Convert.ToInt32(e.Keys("CategoryID"))
    Dim categoryAPI As New CategoriesBLL()
    Dim categoriesData As Northwind.CategoriesDataTable = _
        categoryAPI.GetCategoryByCategoryID(categoryID)
    Dim category As Northwind.CategoriesRow = categoriesData(0)
    If category.IsBrochurePathNull() Then
        deletedCategorysPdfPath = Nothing
    Else
        deletedCategorysPdfPath = category.BrochurePath
    End If
End Sub
Protected Sub Categories_RowDeleted(sender As Object, e As GridViewDeletedEventArgs) _
    Handles Categories.RowDeleted
    
    ' Delete the brochure file if there were no problems deleting the record
    If e.Exception Is Nothing Then
        DeleteRememberedBrochurePath()
    End If
End Sub

W procedurze obsługi zdarzeń RowDeleting, CategoryID wiersza, który jest usuwany, jest pobierany z kolekcji DataKeys programu GridView, do której dostęp można uzyskać w tej procedurze za pośrednictwem kolekcji e.Keys. Następnie wywoływana jest klasa CategoriesBLL, aby zwrócić informacje o usuwanym rekordzie. Jeśli zwrócony CategoriesDataRow obiekt ma wartość inną niż wartośćNULL``BrochurePath , jest on przechowywany w zmiennej deletedCategorysPdfPath strony, dzięki czemu plik można usunąć w procedurze RowDeleted obsługi zdarzeń.

Uwaga / Notatka

Zamiast pobierać szczegóły dla rekordu usuwanego w procedurze obsługi zdarzenia BrochurePath, moglibyśmy alternatywnie dodać Categories do właściwości RowDeleting w GridView i uzyskać dostęp do wartości rekordu za pośrednictwem kolekcji BrochurePath. Spowoduje to nieznaczne zwiększenie rozmiaru stanu widoku kontrolki GridView, ale zmniejszy ilość wymaganego kodu i uniknie jednego odwołania do bazy danych.

Po wywołaniu podstawowego polecenia usuwania obiektu ObjectDataSource program obsługi zdarzeń GridView RowDeleted zostanie wyzwolony. Jeśli nie było żadnych wyjątków podczas usuwania danych i istnieje wartość , deletedCategorysPdfPathplik PDF zostanie usunięty z systemu plików. Należy pamiętać, że ten dodatkowy kod nie jest potrzebny do wyczyszczenia binarnych danych kategorii skojarzonych z jej obrazem. Wynika to z faktu, że dane obrazu są przechowywane bezpośrednio w bazie danych, dlatego usunięcie Categories wiersza spowoduje również usunięcie danych obrazu tej kategorii.

Po dodaniu dwóch procedur obsługi zdarzeń ponownie uruchom ten przypadek testowy. Podczas usuwania kategorii skojarzony z nią plik PDF jest również usuwany.

Aktualizowanie istniejących danych binarnych skojarzonych z rekordami zapewnia kilka interesujących wyzwań. W pozostałej części tego samouczka omówimy dodawanie możliwości aktualizacji do broszury i zdjęcia. Krok 6 bada techniki aktualizowania informacji o broszurze, podczas gdy krok 7 analizuje aktualizowanie obrazu.

Krok 6. Aktualizowanie broszury kategorii

Zgodnie z opisem w samouczku Omówienie wstawiania, aktualizowania i usuwania danych funkcja GridView oferuje wbudowaną obsługę edycji na poziomie wiersza, która może zostać zaimplementowana przez zaznaczenie pola wyboru, jeśli jego bazowe źródło danych jest odpowiednio skonfigurowane. Obecnie obiekt CategoriesDataSource ObjectDataSource nie jest jeszcze skonfigurowany do dołączania obsługi aktualizacji, więc dodajmy to.

Kliknij link Konfiguruj źródło danych w kreatorze ObjectDataSource i przejdź do drugiego kroku. Ze względu na użycie DataObjectMethodAttribute w CategoriesBLL, lista rozwijana UPDATE powinna zostać automatycznie wypełniona przeciążeniem UpdateCategory, które akceptuje cztery parametry wejściowe (dla wszystkich kolumn oprócz Picture). Zmień to tak, aby używało przeciążenia z pięcioma parametrami.

Konfigurowanie obiektu ObjectDataSource do używania metody UpdateCategory zawierającej parametr obrazu

Rysunek 9. Konfigurowanie obiektu ObjectDataSource pod kątem użycia UpdateCategory metody zawierającej parametr Picture (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Źródło ObjectDataSource będzie teraz zawierać wartość dla jej UpdateMethod właściwości, a także odpowiednie UpdateParameter s. Jak wspomniano w kroku 4, Visual Studio ustawia właściwość ObjectDataSource OldValuesParameterFormatString na original_{0} podczas konfiguracji źródła danych za pomocą kreatora. Spowoduje to problemy z wywołaniami metody update i delete. W związku z tym całkowicie wyczyść tę właściwość lub zresetuj ją do wartości domyślnej . {0}

Po ukończeniu pracy kreatora i naprawieniu OldValuesParameterFormatString, deklaratywny znacznik ObjectDataSource powinien wyglądać następująco:

<asp:ObjectDataSource ID="CategoriesDataSource" runat="server" 
    OldValuesParameterFormatString="{0}" SelectMethod="GetCategories" 
    TypeName="CategoriesBLL" InsertMethod="InsertWithPicture" 
    DeleteMethod="DeleteCategory" UpdateMethod="UpdateCategory">
    <InsertParameters>
        <asp:Parameter Name="categoryName" Type="String" />
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="brochurePath" Type="String" />
        <asp:Parameter Name="picture" Type="Object" />
    </InsertParameters>
    <DeleteParameters>
        <asp:Parameter Name="categoryID" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="categoryName" Type="String" />
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="brochurePath" Type="String" />
        <asp:Parameter Name="picture" Type="Object" />
        <asp:Parameter Name="categoryID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Aby uruchomić wbudowane funkcje edycji kontrolki GridView, zaznacz opcję Włącz edytowanie z inteligentnej karty GridView. Spowoduje to ustawienie właściwości CommandField ShowEditButton na True, co spowoduje dodanie przycisku Edytuj (i przycisk Aktualizuj i Anuluj dla edytowanego wiersza).

Konfigurowanie kontrolki GridView do obsługi edycji

Rysunek 10. Konfigurowanie widoku GridView do obsługi edycji (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Odwiedź stronę za pośrednictwem przeglądarki i kliknij jeden z przycisków Edytuj wiersz. Pola CategoryName i Description typu BoundFields są wyświetlane jako pola tekstowe. Pole BrochurePath TemplateField nie ma elementu EditItemTemplate, więc nadal pokazuje link ItemTemplate do broszury. Pole Picture ImageField renderuje się jako TextBox, którego Text właściwość ma przypisaną wartość wartości pola ImageField DataImageUrlField, w tym przypadku CategoryID.

Kontrolka GridView nie ma interfejsu edycji dla ścieżki broszury

Rysunek 11. Kontrolka GridView nie ma interfejsu do edycji (BrochurePathkliknij, aby wyświetlić obraz o pełnym rozmiarze)

Dostosowywanie interfejsu edycjiBrochurePath

Musimy utworzyć interfejs edycji dla BrochurePath pola TemplateField, który umożliwia użytkownikowi wykonywanie następujących czynności:

  • Pozostaw broszurę kategorii as-is,
  • Zaktualizuj broszurę kategorii, przekazując nową broszurę lub
  • Całkowicie usuń broszurę kategorii (w przypadku, gdy kategoria nie ma już skojarzonej broszury).

Musimy również zaktualizować Picture interfejs edycji Pola obrazów, ale przejdziemy do niego w kroku 7.

W tagu inteligentnym GridView kliknij link Edytuj szablony i wybierz pozycję BrochurePath TemplateField s EditItemTemplate z listy rozwijanej. Dodaj kontrolkę Sieci Web RadioButtonList do tego szablonu, ustawiając jej ID właściwość na BrochureOptions i jej AutoPostBack właściwość na True. W oknie Właściwości kliknij przycisk z wielokropkiem we Items właściwości, co spowoduje wyświetlenie Edytora Kolekcji ListItem. Dodaj następujące trzy opcje z Value, odpowiednio 1, 2 i 3.

  • Użyj bieżącej broszury
  • Usuń bieżącą broszurę
  • Przekaż nową broszurę

Ustaw pierwszą ListItem właściwość s Selected na True.

Dodaj trzy elementy ListItems do RadioButtonList

Rysunek 12: Dodaj trzy ListItem elementy do listy RadioButtonList

Pod listą RadioButtonList dodaj kontrolkę FileUpload o nazwie BrochureUpload. Ustaw jej właściwość Visible na wartość False.

Dodaj kontrolkę RadioButtonList i FileUpload do szablonu edycji EditItemTemplate

Rysunek 13: Dodaj kontrolkę RadioButtonList i FileUpload do EditItemTemplate (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Ten element RadioButtonList udostępnia trzy opcje dla użytkownika. Chodzi o to, że kontrolka FileUpload będzie wyświetlana tylko wtedy, gdy wybrano ostatnią opcję Przekaż nową broszurę. Aby to osiągnąć, utwórz procedurę obsługi zdarzeń dla zdarzenia RadioButtonList SelectedIndexChanged i dodaj następujący kod:

Protected Sub BrochureOptions_SelectedIndexChanged _
    (sender As Object, e As EventArgs)
    
    ' Get a reference to the RadioButtonList and its Parent
    Dim BrochureOptions As RadioButtonList = _
        CType(sender, RadioButtonList)
    Dim parent As Control = BrochureOptions.Parent
    ' Now use FindControl("controlID") to get a reference of the 
    ' FileUpload control
    Dim BrochureUpload As FileUpload = _
        CType(parent.FindControl("BrochureUpload"), FileUpload)
    ' Only show BrochureUpload if SelectedValue = "3"
    BrochureUpload.Visible = (BrochureOptions.SelectedValue = "3")
End Sub

Ponieważ kontrolki RadioButtonList i FileUpload znajdują się w szablonie, musimy napisać trochę kodu w celu programowego uzyskiwania dostępu do tych kontrolek. Procedura obsługi zdarzeń SelectedIndexChanged otrzymuje odwołanie do elementu RadioButtonList w parametrze wejściowym sender. Aby uzyskać kontrolkę FileUpload, musimy najpierw pobrać kontrolkę nadrzędną dla RadioButtonList, a następnie użyć z niej metody FindControl("controlID"). Gdy mamy odwołanie do kontrolek RadioButtonList i FileUpload, właściwość kontrolki FileUpload Visible jest ustawiana na wartość True tylko wtedy, jeśli właściwość SelectedValue kontrolki RadioButtonList równa się 3, co jest opcją dla przesłania nowej broszury Value.

Po utworzeniu tego kodu poczekaj chwilę na przetestowanie interfejsu edycji. Kliknij przycisk Edytuj dla wiersza. Początkowo należy wybrać opcję Użyj bieżącej broszury. Zmiana wybranego indeksu powoduje odświeżenie strony. Jeśli zostanie wybrana trzecia opcja, zostanie wyświetlona kontrolka FileUpload, w przeciwnym razie jest ukryta. Rysunek 14 przedstawia interfejs edycji po pierwszym kliknięciu przycisku Edytuj. Rysunek 15 przedstawia interfejs po wybraniu opcji Przekaż nową broszurę.

Początkowo wybrana jest opcja Użyj bieżącej broszury

Rysunek 14. Początkowo wybrana jest opcja Użyj bieżącej broszury (kliknij, aby wyświetlić obraz pełnowymiarowy)

Wybieranie opcji Przekaż nową broszurę Wyświetla kontrolkę FileUpload

Rysunek 15. Wybranie opcji Przekaż nową broszurę wyświetla kontrolkę FileUpload (Kliknij, aby wyświetlić obraz pełnowymiarowy)

Zapisywanie pliku broszury i aktualizowanie kolumnyBrochurePath

Po kliknięciu przycisku Aktualizuj w kontrolce GridView jego RowUpdating zdarzenie zostanie wyzwolone. Wywoływane jest polecenie aktualizacji obiektu ObjectDataSource, a następnie uruchamiane jest zdarzenie GridView RowUpdated . Podobnie jak w przypadku usuwania przepływu pracy, musimy utworzyć programy obsługi zdarzeń dla obu tych zdarzeń. W procedurze RowUpdating obsługi zdarzeń musimy określić, jakie działania podjąć w oparciu o SelectedValueBrochureOptions listy RadioButtonList.

  • Jeśli parametr SelectedValue ma wartość 1, chcemy nadal używać tego samego BrochurePath ustawienia. W związku z tym musimy ustawić parametr s brochurePath ObjectDataSource na istniejącą BrochurePath wartość aktualizowanego rekordu. Parametr ObjectDataSource można ustawić za pomocą brochurePath.
  • Jeśli wartość SelectedValue to 2, chcemy ustawić wartość rekordu BrochurePath na NULL. Można to osiągnąć, ustawiając parametr s brochurePath ObjectDataSource na Nothing, co powoduje użycie bazy danych NULL w instrukcji UPDATE . Jeśli istnieje istniejący plik broszury, który jest usuwany, musimy usunąć istniejący plik. Jednak chcemy to zrobić tylko wtedy, gdy aktualizacja zostanie ukończona bez zgłaszania wyjątku.
  • Jeśli parametr SelectedValue ma wartość 3, chcemy upewnić się, że użytkownik załadował plik PDF, i następnie zapisać go w systemie plików oraz zaktualizować wartość kolumny rekordu BrochurePath. Ponadto, jeśli istnieje istniejący plik broszury, który jest zastępowany, musimy usunąć poprzedni plik. Jednak chcemy to zrobić tylko wtedy, gdy aktualizacja zostanie ukończona bez zgłaszania wyjątku.

Kroki, które należy wykonać, gdy element RadioButtonList ma SelectedValue wartość 3, są praktycznie identyczne z tymi, które są używane przez program obsługi zdarzeń kontrolki ItemInserting DetailsView. Ta procedura obsługi zdarzeń jest wykonywana po dodaniu nowego rekordu kategorii z kontrolki DetailsView dodanej w poprzednim samouczku. W związku z tym należy refaktoryzować tę funkcjonalność do oddzielnych metod. W szczególności przenieśliśmy wspólną funkcjonalność na dwie metody:

  • ProcessBrochureUpload(FileUpload, out bool) przyjmuje jako dane wejściowe wystąpienie kontrolki FileUpload i wartość logiczną danych wyjściowych, która określa, czy operacja usuwania lub edycji powinna być kontynuowana, czy też powinna zostać anulowana z powodu błędu weryfikacji. Ta metoda zwraca ścieżkę do zapisanego pliku lub null jeśli żaden plik nie został zapisany.
  • DeleteRememberedBrochurePath usuwa plik określony przez ścieżkę w zmiennej strony deletedCategorysPdfPath, jeśli deletedCategorysPdfPath nie jest null.

Poniższy kod dla tych dwóch metod. Zwróć uwagę na podobieństwo między ProcessBrochureUpload a kontrolką DetailsView ItemInserting z poprzedniego samouczka. W tym samouczku zaktualizowano procedury obsługi zdarzeń DetailsView, aby korzystały z tych nowych metod. Pobierz kod skojarzony z tym samouczkiem, aby zobaczyć modyfikacje procedur obsługi zdarzeń kontrolki DetailsView.

Private Function ProcessBrochureUpload _
    (BrochureUpload As FileUpload, CancelOperation As Boolean) As String
    
    CancelOperation = False    ' by default, do not cancel operation
    If BrochureUpload.HasFile Then
        ' Make sure that a PDF has been uploaded
        If String.Compare(System.IO.Path.GetExtension(BrochureUpload.FileName), _
            ".pdf", True) <> 0 Then
            
            UploadWarning.Text = _
                "Only PDF documents may be used for a category's brochure."
            UploadWarning.Visible = True
            CancelOperation = True
            Return Nothing
        End If
        Const BrochureDirectory As String = "~/Brochures/"
        Dim brochurePath As String = BrochureDirectory + BrochureUpload.FileName
        Dim fileNameWithoutExtension As String = _
            System.IO.Path.GetFileNameWithoutExtension(BrochureUpload.FileName)
        Dim iteration As Integer = 1
        While System.IO.File.Exists(Server.MapPath(brochurePath))
            brochurePath = String.Concat(BrochureDirectory, _
                fileNameWithoutExtension, "-", iteration, ".pdf")
            iteration += 1
        End While
        ' Save the file to disk and set the value of the brochurePath parameter
        BrochureUpload.SaveAs(Server.MapPath(brochurePath))
        Return brochurePath
    Else
        ' No file uploaded
        Return Nothing
    End If
End Function
Private Sub DeleteRememberedBrochurePath()
    ' Is there a file to delete?
    If deletedCategorysPdfPath IsNot Nothing Then
        System.IO.File.Delete(Server.MapPath(deletedCategorysPdfPath))
    End If
End Sub

Obsługa zdarzeń GridView RowUpdating i RowUpdated wykorzystuje metody ProcessBrochureUpload i DeleteRememberedBrochurePath, jak pokazano w poniższym kodzie:

Protected Sub Categories_RowUpdating _
    (sender As Object, e As GridViewUpdateEventArgs) _
    Handles Categories.RowUpdating
    
    ' Reference the RadioButtonList
    Dim BrochureOptions As RadioButtonList = _
        CType(Categories.Rows(e.RowIndex).FindControl("BrochureOptions"), _
            RadioButtonList)
    ' Get BrochurePath information about the record being updated
    Dim categoryID As Integer = Convert.ToInt32(e.Keys("CategoryID"))
    Dim categoryAPI As New CategoriesBLL()
    Dim categoriesData As Northwind.CategoriesDataTable = _
        categoryAPI.GetCategoryByCategoryID(categoryID)
    Dim category As Northwind.CategoriesRow = categoriesData(0)
    If BrochureOptions.SelectedValue = "1" Then
        ' Use current value for BrochurePath
        If category.IsBrochurePathNull() Then
            e.NewValues("brochurePath") = Nothing
        Else
            e.NewValues("brochurePath") = category.BrochurePath
        End If
    ElseIf BrochureOptions.SelectedValue = "2" Then
        ' Remove the current brochure (set it to NULL in the database)
        e.NewValues("brochurePath") = Nothing
    ElseIf BrochureOptions.SelectedValue = "3" Then
        ' Reference the BrochurePath FileUpload control
        Dim BrochureUpload As FileUpload = _
            CType(categories.Rows(e.RowIndex).FindControl("BrochureUpload"), _
                FileUpload)
        ' Process the BrochureUpload
        Dim cancelOperation As Boolean = False
        e.NewValues("brochurePath") = _
            ProcessBrochureUpload(BrochureUpload, cancelOperation)
        e.Cancel = cancelOperation
    Else
        ' Unknown value!
        Throw New ApplicationException( _
            String.Format("Invalid BrochureOptions value, {0}", _
                BrochureOptions.SelectedValue))
    End If
    If BrochureOptions.SelectedValue = "2" OrElse _
        BrochureOptions.SelectedValue = "3" Then
        
        ' "Remember" that we need to delete the old PDF file
        If (category.IsBrochurePathNull()) Then
            deletedCategorysPdfPath = Nothing
        Else
            deletedCategorysPdfPath = category.BrochurePath
        End If
    End If
End Sub
Protected Sub Categories_RowUpdated _
    (sender As Object, e As GridViewUpdatedEventArgs) _
    Handles Categories.RowUpdated
    
    ' If there were no problems and we updated the PDF file, 
    ' then delete the existing one
    If e.Exception Is Nothing Then
        DeleteRememberedBrochurePath()
    End If
End Sub

Zwróć uwagę, jak RowUpdating program obsługi zdarzeń używa serii instrukcji warunkowych, aby wykonać odpowiednią akcję na podstawie wartości właściwości BrochureOptions RadioButtonList SelectedValue.

Dzięki temu kodowi można edytować kategorię i używać bieżącej broszury, nie używać broszury lub załadować nową. Śmiało, wypróbuj to. Ustaw punkty przerwania w RowUpdating procedurach obsługi zdarzeń i RowUpdated, aby uzyskać obraz przepływu pracy.

Krok 7: Wgrywanie nowego zdjęcia

Picture Interfejs edycji ImageField wyświetla się jako pole tekstowe wypełnione wartością z jego DataImageUrlField właściwości. Podczas procesu edycji, GridView przekazuje parametr do ObjectDataSource, którego nazwa to wartość właściwości ImageField DataImageUrlField, a wartość to ta wprowadzona do pola tekstowego w interfejsie edycji. To zachowanie jest odpowiednie, gdy obraz jest zapisywany jako plik w systemie plików i DataImageUrlField zawiera pełny adres URL obrazu. W takich okolicznościach interfejs edycji wyświetla adres URL obrazu w polu tekstowym, który użytkownik może zmienić i zapisać z powrotem do bazy danych. Przyznajmy, że ten interfejs domyślny nie zezwala użytkownikowi na przekazywanie nowego obrazu, ale umożliwia mu zmianę adresu URL obrazu z bieżącej wartości na inną. Jednak w tym samouczku domyślny interfejs edycji obiektu ImageField nie wystarczy, ponieważ Picture dane binarne są przechowywane bezpośrednio w bazie danych, a właściwość DataImageUrlField zawiera tylko CategoryID element.

Aby lepiej zrozumieć, co się dzieje w naszym samouczku, gdy użytkownik edytuje wiersz z polem ImageField, rozważmy następujący przykład: użytkownik edytuje wiersz z wartością CategoryID 10, co powoduje, że pole ImageField jest renderowane jako pole tekstowe z wartością Picture 10. Załóżmy, że użytkownik zmienia wartość w tym polu tekstowym na 50 i klika przycisk Aktualizuj. Nastąpi wywołanie zwrotne, a kontrolka GridView początkowo tworzy parametr o nazwie CategoryID z wartością 50. Jednak przed wysłaniem tego parametru (oraz parametrów CategoryName i Description), kontrolka GridView dodaje wartości z kolekcji DataKeys. W związku z tym zastępuje CategoryID parametr wartością bazową CategoryID bieżącego wiersza, 10. Krótko mówiąc, interfejs edycji ImageField nie ma wpływu na przepływ pracy edycji dla tego samouczka, ponieważ nazwy właściwości ImageField DataImageUrlField i wartość siatki DataKey są takie same.

Chociaż pole ImageField ułatwia wyświetlanie obrazu na podstawie danych bazy danych, nie chcemy udostępniać pola tekstowego w interfejsie edycji. Zamiast tego chcemy zaoferować kontrolkę FileUpload, której użytkownik końcowy może użyć do zmiany obrazu kategorii. W przeciwieństwie do wartości BrochurePath, w przypadku tych samouczków zdecydowaliśmy się wymagać, aby każda kategoria miała zdjęcie. W związku z tym nie musimy pozwalać użytkownikowi na wskazanie, że nie ma skojarzonego obrazu. Użytkownik może albo przesłać nowy obraz, albo pozostawić bieżący obraz as-is.

Aby dostosować interfejs edycji ImageField, musimy przekonwertować go na pole szablonu. W tagu inteligentnym GridView kliknij link Edytuj kolumny, wybierz pozycję ImageField, a następnie kliknij link Konwertuj to pole na pole szablonu.

Konwertowanie pola obrazu na pole szablonu

Rysunek 16. Konwertowanie pola obrazu na pole szablonu

Przekonwertowanie pola imagefield na pole szablonu w ten sposób powoduje wygenerowanie pola TemplateField z dwoma szablonami. Jak pokazano w poniższej składni deklaratywnej, kontrolka sieciowa obrazu ItemTemplate, której właściwość ImageUrl jest przypisywana przy użyciu składni powiązania danych na podstawie właściwości DataImageUrlField i DataImageUrlFormatString ImageField. Obiekt EditItemTemplate zawiera element TextBox, którego właściwość Text jest powiązana z wartością określoną przez właściwość DataImageUrlField.

<asp:TemplateField>
    <EditItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" 
            Text='<%# Eval("CategoryID") %>'></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Image ID="Image1" runat="server" 
            ImageUrl='<%# Eval("CategoryID", 
                "DisplayCategoryPicture.aspx?CategoryID={0}") %>' />
    </ItemTemplate>
</asp:TemplateField>

Musimy zaktualizować element , EditItemTemplate aby użyć kontrolki FileUpload. W tagu inteligentnym GridView kliknij link Edytuj szablony, a następnie wybierz pozycję Picture TemplateField s EditItemTemplate z listy rozwijanej. W szablonie powinieneś zobaczyć pole tekstowe, usuń je. Następnie przeciągnij kontrolkę FileUpload z przybornika do szablonu, ustawiając jej ID wartość na PictureUpload. Dodaj również tekst Aby zmienić obraz kategorii, określ nowy obraz. Aby zachować ten sam obraz kategorii, pozostaw również pole puste w szablonie.

Dodawanie kontrolki FileUpload do elementu EditItemTemplate

Rysunek 17. Dodawanie kontrolki FileUpload do elementu EditItemTemplate (Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Po dostosowaniu interfejsu edycji wyświetl postęp w przeglądarce. Podczas wyświetlania wiersza w trybie tylko do odczytu obraz kategorii jest wyświetlany tak jak poprzednio, ale kliknięcie przycisku Edytuj renderuje kolumnę obrazu jako tekst z kontrolką FileUpload.

Interfejs edycji zawiera kontrolkę FileUpload

Rysunek 18. Interfejs edycji zawiera kontrolkę FileUpload (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Pamiętaj, że obiekt ObjectDataSource jest skonfigurowany do wywoływania metody klasy CategoriesBLLUpdateCategory, która przyjmuje jako dane wejściowe binarne dane dla obrazu jako tablica Byte. Jeśli jednak tablica ma wartość Nothing, zostaje wywołane alternatywne przeciążenie UpdateCategory, które wystawia instrukcję SQL UPDATE, nie modyfikując kolumny Picture, dzięki czemu aktualny obraz kategorii pozostaje bez zmian. W związku z tym w procedurze obsługi zdarzeń GridView RowUpdating musimy odwołać się programowo do kontrolki FileUpload PictureUpload i określić, czy plik został przekazany. Jeśli żaden nie został przesłany, nie chcemy określać wartości dla parametru picture. Z drugiej strony, jeśli plik został przekazany w kontrolce PictureUpload FileUpload, chcemy upewnić się, że jest to plik JPG. Jeśli tak jest, możemy wysłać jego zawartość binarną do obiektu ObjectDataSource za pomocą parametru picture .

Podobnie jak w przypadku kodu używanego w kroku 6, większość kodu potrzebnego tutaj już istnieje w procedurze obsługi zdarzeń DetailsView ItemInserting. W związku z tym refaktoryzowałem typowe funkcje w nowej metodzie ValidPictureUpload, i zaktualizowałem ItemInserting procedurę obsługi zdarzeń w celu użycia tej metody.

Dodaj następujący kod do początku programu obsługi zdarzeń GridView RowUpdating . Ważne jest, aby ten kod został zapisany przed kodem, który zapisuje plik broszury, ponieważ nie chcemy zapisywać broszury w systemie plików serwera internetowego, jeśli zostanie przekazany nieprawidłowy plik obrazu.

' Reference the PictureUpload FileUpload
Dim PictureUpload As FileUpload = _
    CType(categories.Rows(e.RowIndex).FindControl("PictureUpload"), _
        FileUpload)
If PictureUpload.HasFile Then
    ' Make sure the picture upload is valid
    If ValidPictureUpload(PictureUpload) Then
        e.NewValues("picture") = PictureUpload.FileBytes
    Else
        ' Invalid file upload, cancel update and exit event handler
        e.Cancel = True
        Exit Sub
    End If
End If

Metoda ValidPictureUpload(FileUpload) przyjmuje kontrolkę FileUpload jako jedyny parametr wejściowy i sprawdza rozszerzenie przekazanego pliku, aby upewnić się, że przekazany plik jest plikiem JPG; jest wywoływany tylko wtedy, gdy plik obrazu zostanie przekazany. Jeśli plik nie zostanie przekazany, parametr obrazu nie zostanie ustawiony i w związku z tym używa jego wartości domyślnej Nothing. Jeśli obraz został przekazany i ValidPictureUpload zwraca True, parametr picture jest przypisany do danych binarnych przekazanego obrazu; jeśli metoda zwraca False, przepływ pracy aktualizacji zostanie anulowany, a program obsługi zdarzeń zakończy działanie.

Jest następujący kod metody, który został refaktoryzowany z procedury obsługi zdarzeń DetailsView:

Private Function ValidPictureUpload(ByVal PictureUpload As FileUpload) As Boolean
    ' Make sure that a JPG has been uploaded
    If String.Compare(System.IO.Path.GetExtension(PictureUpload.FileName), _
        ".jpg", True) <> 0 AndAlso _
        String.Compare(System.IO.Path.GetExtension(PictureUpload.FileName), _
        ".jpeg", True) <> 0 Then
        
        UploadWarning.Text = _
            "Only JPG documents may be used for a category's picture."
        UploadWarning.Visible = True
        Return False
    Else
        Return True
    End If
End Function

Krok 8. Zastępowanie oryginalnych kategorii obrazów przy użyciu plików JPG

Pamiętaj, że oryginalne osiem obrazów kategorii to pliki mapy bitowej opakowane w nagłówek OLE. Teraz, gdy dodaliśmy możliwość edytowania istniejącego obrazu rekordu, zastąp te mapy bitowe plikami JPG. Jeśli chcesz nadal używać bieżących obrazów kategorii, możesz przekonwertować je na pliki JPG, wykonując następujące czynności:

  1. Zapisz obrazy mapy bitowej na dysku twardym. Odwiedź stronę UpdatingAndDeleting.aspx w przeglądarce i dla każdej z pierwszych ośmiu kategorii kliknij prawym przyciskiem myszy obraz i wybierz opcję zapisu obrazu.
  2. Otwórz obraz w wybranym edytorze obrazów. Możesz na przykład użyć programu Microsoft Paint.
  3. Zapisz mapę bitową jako obraz JPG.
  4. Zaktualizuj obraz kategorii za pomocą interfejsu edycji przy użyciu pliku JPG.

Po edytowaniu kategorii i przesłaniu grafiki JPG, nie będzie się ona renderować w przeglądarce, ponieważ DisplayCategoryPicture.aspx strona odcina pierwsze 78 bajtów z grafik pierwszych ośmiu kategorii. Rozwiąż ten problem, usuwając kod, który wykonuje usuwanie nagłówka OLE. Po wykonaniu DisplayCategoryPicture.aspx``Page_Load tej czynności program obsługi zdarzeń powinien mieć tylko następujący kod:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim categoryID As Integer = _
        Convert.ToInt32(Request.QueryString("CategoryID"))
    ' Get information about the specified category
    Dim categoryAPI As New CategoriesBLL()
    Dim categories As Northwind.CategoriesDataTable = _
        categoryAPI.GetCategoryWithBinaryDataByCategoryID(categoryID)
    Dim category As Northwind.CategoriesRow = categories(0)
    ' For new categories, images are JPGs...
    ' Output HTTP headers providing information about the binary data
    Response.ContentType = "image/jpeg"
    ' Output the binary data
    Response.BinaryWrite(category.Picture)
End Sub

Uwaga / Notatka

Interfejsy wstawiania i edytowania strony UpdatingAndDeleting.aspx mogłyby być nieco bardziej dopracowane. Pola CategoryName i Description w kontrolkach DetailsView i GridView powinny być konwertowane na pola szablonów. Ponieważ CategoryName nie zezwala na NULL wartości, należy dodać element RequiredFieldValidator. I Description pole tekstowe prawdopodobnie powinno zostać przekonwertowane na wielowierszowe pole tekstowe. Pozostawiam te ostatnie szlify jako Twoje ćwiczenie.

Podsumowanie

Ten samouczek kończy nasz przegląd pracy z danymi binarnymi. W tym samouczku i w poprzednich trzech opisano sposób przechowywania danych binarnych w systemie plików lub bezpośrednio w bazie danych. Użytkownik dostarcza dane binarne do systemu, wybierając plik z dysku twardego i przekazując go do serwera internetowego, gdzie może być przechowywany w systemie plików lub wstawiony do bazy danych. ASP.NET 2.0 zawiera kontrolkę FileUpload, która sprawia, że interfejs jest tak łatwy, jak przeciąganie i upuszczanie. Jednak jak wspomniano w poradniku Przekazywanie plików, kontrolka FileUpload jest odpowiednia tylko dla stosunkowo małych plików do przesyłania, najlepiej nie przekraczających jednego megabajta. Omówiliśmy również sposób kojarzenia przekazanych danych z bazowym modelem danych, a także sposobu edytowania i usuwania danych binarnych z istniejących rekordów.

W następnym zestawie samouczków przedstawiono różne techniki buforowania. Buforowanie zapewnia metodę poprawy ogólnej wydajności aplikacji przez pobieranie wyników z kosztownych operacji i przechowywanie ich w lokalizacji, do których można szybciej uzyskać dostęp.

Szczęśliwe programowanie!

Informacje o autorze

Scott Mitchell, autor siedmiu książek ASP/ASP.NET i założyciel 4GuysFromRolla.com, współpracuje z technologiami internetowymi firmy Microsoft od 1998 roku. Scott pracuje jako niezależny konsultant, trener i pisarz. Jego najnowsza książka to Sams Teach Yourself ASP.NET 2.0 w ciągu 24 godzin. Można go uzyskać pod adresem mitchell@4GuysFromRolla.com.

Specjalne podziękowania

Ta seria samouczków została omówiona przez wielu przydatnych recenzentów. Główny recenzent tego samouczka to Teresa Murphy. Chcesz przejrzeć nadchodzące artykuły MSDN? Jeśli tak, napisz do mnie na adres mitchell@4GuysFromRolla.com.