Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Komponent ASP.NET Core Blazor
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby uzyskać bieżącą wersję, zobacz wersję .NET 10 tego artykułu.
Składnik QuickGrid jest składnikiem Razor umożliwiającym szybkie i wydajne wyświetlanie danych w formie tabelarycznej.
QuickGrid Udostępnia prosty i wygodny składnik siatki danych dla typowych scenariuszy renderowania siatki i służy jako architektura referencyjna i punkt odniesienia wydajności dla składników siatki danych.
QuickGrid jest wysoce zoptymalizowany i wykorzystuje zaawansowane techniki w celu uzyskania optymalnej wydajności renderowania.
Pakiet
Dodaj odwołanie do pakietu Microsoft.AspNetCore.Components.QuickGrid package.
Uwaga
Aby uzyskać wskazówki dotyczące dodawania pakietów do aplikacji .NET, zobacz artykuły w Install and manage packages at Package consumption workflow (dokumentacja NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.
Przykładowa aplikacja
Aby zapoznać się z różnymi pokazami QuickGrid, zobacz QuickGrid dla przykładowej aplikacji Blazor. Witryna demonstracyjna jest hostowana na stronach GitHub. Witryna ładuje się szybko dzięki statycznemu prerenderowaniu przy użyciu projektu GitHub utrzymywanego przez społeczność.
QuickGrid implementacja
Aby zaimplementować QuickGrid składnik:
- Określ tagi składnika
QuickGridw Razor znaczniku (<QuickGrid>...</QuickGrid>). - Nadaj siatce nazwę możliwe do utworzenia zapytania źródło danych. Użyj jednego z następujących źródeł danych:
-
Items: dopuszczana
IQueryable<TGridItem>wartość null , gdzieTGridItemjest typem danych reprezentowanych przez każdy wiersz w siatce. - ItemsProvider: wywołanie zwrotne, które dostarcza dane dla siatki.
-
Items: dopuszczana
-
QueryParameterNameOptions: Określa nazwy parametrów ciągu zapytania, które utrwalają kolumnę sortowania siatki, kierunek sortowania i numer strony w adresie URL. Wartość domyślna to wystąpienie, które powoduje wyświetlenie parametrów zapytania o nazwach "sort", "direction" i "page". Przypisywanie unikatowych nazw do tych parametrów ciągu zapytania umożliwia używanie wieluQuickGridskładników na tej samej stronie bez konfliktów parametrów adresu URL ze sobą. Aby uzyskać więcej informacji, zobacz sekcje tryby stronicowania, nazwy parametrów zapytania i wiele siatek na tej samej stronie. -
Class: opcjonalna nazwa klasy CSS. Jeśli zostanie podana, nazwa klasy jest uwzględniona w atrybucie
classrenderowanej tabeli. -
Theme: Nazwa motywu (wartość domyślna:
default). Ma to wpływ na to, które reguły stylu pasują do tabeli. - Virtualize: Jeśli true, siatka jest renderowana przy użyciu wirtualizacji. Jest to zwykle używane w połączeniu z przewijaniem i umożliwia pobranie oraz renderowanie tylko danych wokół obszaru przewijanego widoku. Może to znacznie poprawić wydajność podczas przewijania dużych zestawów danych. Jeśli używasz Virtualize, należy podać wartość dla ItemSize i upewnić się, że każdy wiersz jest renderowany ze stałą wysokością. Ogólnie rzecz biorąc, zaleca się nie używać Virtualize , jeśli ilość renderowanych danych jest mała lub jeśli używasz stronicowania.
- ItemSize: dotyczy tylko podczas korzystania z Virtualize. ItemSize definiuje oczekiwaną wysokość w pikselach dla każdego wiersza, umożliwiając mechanizmowi wirtualizacji pobranie prawidłowej liczby elementów odpowiadających rozmiarowi wyświetlania i zapewnienie dokładnego przewijania.
-
ItemKey: Opcjonalnie definiuje wartość dla
@keykażdego renderowanego wiersza. Zazwyczaj służy do określania unikatowego identyfikatora, takiego jak wartość klucza podstawowego, dla każdego elementu danych. Dzięki temu siatka może zachować skojarzenie między elementami wierszy a elementami danych na podstawie ich unikalnych identyfikatorów, nawet jeśliTGridItemwystąpienia są zastępowane przez nowe kopie (na przykład po nowym zapytaniu względem bazowego magazynu danych). Jeśli@keynie jest ustawiona, to jest instancjaTGridItem. -
OverscanCount: definiuje liczbę dodatkowych elementów do renderowania przed i po widocznym regionie w celu zmniejszenia częstotliwości renderowania podczas przewijania. Chociaż wyższe wartości mogą poprawić płynność przewijania przez renderowanie większej liczby elementów poza ekranem, wyższa wartość może również spowodować wzrost początkowych czasów ładowania. Zalecane jest znalezienie równowagi na podstawie rozmiaru zestawu danych i wymagań dotyczących środowiska użytkownika. Domyślna wartość to
3. Dostępne tylko w przypadku korzystania z programu Virtualize. -
InitialItemIndex: dotyczy tylko podczas korzystania z Virtualize. Przewija siatkę do podanego indeksu wiersza liczonego od zera podczas pierwszego renderowania interaktywnego. Wartość jest stosowana jednokrotnie i ograniczana do dopuszczalnego zakresu. To przekierowuje do wewnętrznego składnikaVirtualize. Aby uzyskać więcej informacji, zobaczwirtualizację komponentów w ASP.NET Core . -
ScrollToItemAsync: dotyczy tylko podczas korzystania z Virtualize. Programowo przewija siatkę do wiersza o podanym indeksie liczonym od zera, tak aby znalazł się u góry. Ostatnie wywołanie wygrywa, a metoda zgłasza InvalidOperationException błąd, gdy wirtualizacja jest wyłączona lub siatka nie jest jeszcze renderowana. To przekierowuje do wewnętrznego składnikaVirtualize. Aby uzyskać więcej informacji, zobaczwirtualizację komponentów w ASP.NET Core . -
AnchorMode: dotyczy tylko podczas korzystania z Virtualize. Określa sposób działania widoku na krawędziach listy, gdy elementy są dodawane dynamicznie (ustawienie domyślne:Start). Jest to eksperymentalny interfejs API, który wymaga włączenia diagnostykiASP0030i przekazuje dalej do wewnętrznego składnikaVirtualize. Aby uzyskać więcej informacji, zobaczwirtualizację komponentów w ASP.NET Core . -
ItemComparer: dotyczy tylko podczas korzystania z Virtualize. Komparator używany do wykrywania, czy elementy zostały dodane na początku czy na końcu między kolejnymi załadowaniami danych, co jest przydatne w przypadku elementów typu klasowego dostarczanych przez element ItemsProvider. Jest to eksperymentalny interfejs API, który wymaga włączenia diagnostykiASP0030i przekazuje dalej do wewnętrznego składnikaVirtualize. Aby uzyskać więcej informacji, zobaczwirtualizację komponentów w ASP.NET Core . -
Pagination: opcjonalnie łączy to wystąpienie
TGridItemz modelem PaginationState, poprzez co siatka pobiera i renderuje tylko bieżącą stronę danych. Jest to zwykle używane w połączeniu ze składnikiem Paginator lub inną logiką interfejsu użytkownika, która wyświetla i aktualizuje podane wystąpienie PaginationState. PaginationState Zawiera interfejs API umożliwiający interakcję z bieżącym indeksem stron opartym na zera, liczbą elementów na każdej stronie, indeksem zerowym ostatniej strony oraz całkowitą liczbą elementów na wszystkich stronach. - W treści podrzędnej QuickGrid (RenderFragment) określ elementy PropertyColumn<TGridItem,TProp>, reprezentujące kolumny
TGridItem, których komórki wyświetlają wartości:- Property: definiuje wartość, która ma być wyświetlana w komórkach tej kolumny.
-
Format: opcjonalnie określa ciąg formatu dla wartości. Użycie Format wymaga, aby typ
TPropimplementował IFormattable. - Sortable: wskazuje, czy dane powinny być sortowalne według tej kolumny. Wartość domyślna może się różnić w zależności od typu kolumny. Na przykład element TemplateColumn<TGridItem> jest sortowany, jeśli określono jakikolwiek SortBy parametr.
-
InitialSortDirection: wskazuje kierunek sortowania, jeśli IsDefaultSortColumn ma wartość
true. - IsDefaultSortColumn: wskazuje, czy ta kolumna ma być sortowana domyślnie.
- PlaceholderTemplate: Jeśli określono, zwirtualizowane siatki używają tego szablonu do renderowania komórek, których dane nie zostały załadowane.
- HeaderTemplate: opcjonalny szablon komórki nagłówka tej kolumny. Jeśli nie zostanie określony, domyślny szablon nagłówka zawiera element Title, wraz z odpowiednimi wskaźnikami sortowania i przyciskami opcji.
- Title: tekst tytułu kolumny. Tytuł jest renderowany automatycznie, jeśli HeaderTemplate nie jest używany.
- Określ tagi składnika
QuickGridw Razor znaczniku (<QuickGrid>...</QuickGrid>). - Nadaj siatce nazwę możliwe do utworzenia zapytania źródło danych. Użyj jednego z następujących źródeł danych:
-
Items: dopuszczana
IQueryable<TGridItem>wartość null , gdzieTGridItemjest typem danych reprezentowanych przez każdy wiersz w siatce. - ItemsProvider: wywołanie zwrotne, które dostarcza dane dla siatki.
-
Items: dopuszczana
-
Class: opcjonalna nazwa klasy CSS. Jeśli zostanie podana, nazwa klasy jest uwzględniona w atrybucie
classrenderowanej tabeli. -
Theme: Nazwa motywu (wartość domyślna:
default). Ma to wpływ na to, które reguły stylu pasują do tabeli. - Virtualize: Jeśli true, siatka jest renderowana przy użyciu wirtualizacji. Jest to zwykle używane w połączeniu z przewijaniem i umożliwia pobranie oraz renderowanie tylko danych wokół obszaru przewijanego widoku. Może to znacznie poprawić wydajność podczas przewijania dużych zestawów danych. Jeśli używasz Virtualize, należy podać wartość dla ItemSize i upewnić się, że każdy wiersz jest renderowany ze stałą wysokością. Ogólnie rzecz biorąc, zaleca się nie używać Virtualize , jeśli ilość renderowanych danych jest mała lub jeśli używasz stronicowania.
- ItemSize: dotyczy tylko podczas korzystania z Virtualize. ItemSize definiuje oczekiwaną wysokość w pikselach dla każdego wiersza, umożliwiając mechanizmowi wirtualizacji pobranie prawidłowej liczby elementów odpowiadających rozmiarowi wyświetlania i zapewnienie dokładnego przewijania.
-
ItemKey: Opcjonalnie definiuje wartość dla
@keykażdego renderowanego wiersza. Zazwyczaj służy do określania unikatowego identyfikatora, takiego jak wartość klucza podstawowego, dla każdego elementu danych. Dzięki temu siatka może zachować skojarzenie między elementami wierszy a elementami danych na podstawie ich unikalnych identyfikatorów, nawet jeśliTGridItemwystąpienia są zastępowane przez nowe kopie (na przykład po nowym zapytaniu względem bazowego magazynu danych). Jeśli@keynie jest ustawiona, to jest instancjaTGridItem. -
OverscanCount: definiuje liczbę dodatkowych elementów do renderowania przed i po widocznym regionie w celu zmniejszenia częstotliwości renderowania podczas przewijania. Chociaż wyższe wartości mogą poprawić płynność przewijania przez renderowanie większej liczby elementów poza ekranem, wyższa wartość może również spowodować wzrost początkowych czasów ładowania. Zalecane jest znalezienie równowagi na podstawie rozmiaru zestawu danych i wymagań dotyczących środowiska użytkownika. Domyślna wartość to
3. Dostępne tylko w przypadku korzystania z programu Virtualize. -
Pagination: opcjonalnie łączy to wystąpienie
TGridItemz modelem PaginationState, poprzez co siatka pobiera i renderuje tylko bieżącą stronę danych. Jest to zwykle używane w połączeniu ze składnikiem Paginator lub inną logiką interfejsu użytkownika, która wyświetla i aktualizuje podane wystąpienie PaginationState. PaginationState Zawiera interfejs API umożliwiający interakcję z bieżącym indeksem stron opartym na zera, liczbą elementów na każdej stronie, indeksem zerowym ostatniej strony oraz całkowitą liczbą elementów na wszystkich stronach. - W treści podrzędnej QuickGrid (RenderFragment) określ elementy PropertyColumn<TGridItem,TProp>, reprezentujące kolumny
TGridItem, których komórki wyświetlają wartości:- Property: definiuje wartość, która ma być wyświetlana w komórkach tej kolumny.
-
Format: opcjonalnie określa ciąg formatu dla wartości. Użycie Format wymaga, aby typ
TPropimplementował IFormattable. - Sortable: wskazuje, czy dane powinny być sortowalne według tej kolumny. Wartość domyślna może się różnić w zależności od typu kolumny. Na przykład element TemplateColumn<TGridItem> jest sortowany, jeśli określono jakikolwiek SortBy parametr.
-
InitialSortDirection: wskazuje kierunek sortowania, jeśli IsDefaultSortColumn ma wartość
true. - IsDefaultSortColumn: wskazuje, czy ta kolumna ma być sortowana domyślnie.
- PlaceholderTemplate: Jeśli określono, zwirtualizowane siatki używają tego szablonu do renderowania komórek, których dane nie zostały załadowane.
- HeaderTemplate: opcjonalny szablon komórki nagłówka tej kolumny. Jeśli nie zostanie określony, domyślny szablon nagłówka zawiera element Title, wraz z odpowiednimi wskaźnikami sortowania i przyciskami opcji.
- Title: tekst tytułu kolumny. Tytuł jest renderowany automatycznie, jeśli HeaderTemplate nie jest używany.
- Określ tagi składnika
QuickGridw Razor znaczniku (<QuickGrid>...</QuickGrid>). - Nadaj siatce nazwę możliwe do utworzenia zapytania źródło danych. Użyj jednego z następujących źródeł danych:
-
Items: dopuszczana
IQueryable<TGridItem>wartość null , gdzieTGridItemjest typem danych reprezentowanych przez każdy wiersz w siatce. - ItemsProvider: wywołanie zwrotne, które dostarcza dane dla siatki.
-
Items: dopuszczana
-
Class: opcjonalna nazwa klasy CSS. Jeśli zostanie podana, nazwa klasy jest uwzględniona w atrybucie
classrenderowanej tabeli. -
Theme: Nazwa motywu (wartość domyślna:
default). Ma to wpływ na to, które reguły stylu pasują do tabeli. - Virtualize: Jeśli true, siatka jest renderowana przy użyciu wirtualizacji. Jest to zwykle używane w połączeniu z przewijaniem i umożliwia pobranie oraz renderowanie tylko danych wokół obszaru przewijanego widoku. Może to znacznie poprawić wydajność podczas przewijania dużych zestawów danych. Jeśli używasz Virtualize, należy podać wartość dla ItemSize i upewnić się, że każdy wiersz jest renderowany ze stałą wysokością. Ogólnie rzecz biorąc, zaleca się nie używać Virtualize , jeśli ilość renderowanych danych jest mała lub jeśli używasz stronicowania.
- ItemSize: dotyczy tylko podczas korzystania z Virtualize. ItemSize definiuje oczekiwaną wysokość w pikselach dla każdego wiersza, umożliwiając mechanizmowi wirtualizacji pobranie prawidłowej liczby elementów odpowiadających rozmiarowi wyświetlania i zapewnienie dokładnego przewijania.
-
ItemKey: Opcjonalnie definiuje wartość dla
@keykażdego renderowanego wiersza. Zazwyczaj służy do określania unikatowego identyfikatora, takiego jak wartość klucza podstawowego, dla każdego elementu danych. Dzięki temu siatka może zachować skojarzenie między elementami wierszy a elementami danych na podstawie ich unikalnych identyfikatorów, nawet jeśliTGridItemwystąpienia są zastępowane przez nowe kopie (na przykład po nowym zapytaniu względem bazowego magazynu danych). Jeśli@keynie jest ustawiona, to jest instancjaTGridItem. -
Pagination: opcjonalnie łączy to wystąpienie
TGridItemz modelem PaginationState, poprzez co siatka pobiera i renderuje tylko bieżącą stronę danych. Jest to zwykle używane w połączeniu ze składnikiem Paginator lub inną logiką interfejsu użytkownika, która wyświetla i aktualizuje podane wystąpienie PaginationState. PaginationState Zawiera interfejs API umożliwiający interakcję z bieżącym indeksem stron opartym na zera, liczbą elementów na każdej stronie, indeksem zerowym ostatniej strony oraz całkowitą liczbą elementów na wszystkich stronach. - W treści podrzędnej QuickGrid (RenderFragment) określ elementy PropertyColumn<TGridItem,TProp>, reprezentujące kolumny
TGridItem, których komórki wyświetlają wartości:- Property: definiuje wartość, która ma być wyświetlana w komórkach tej kolumny.
-
Format: opcjonalnie określa ciąg formatu dla wartości. Użycie Format wymaga, aby typ
TPropimplementował IFormattable. - Sortable: wskazuje, czy dane powinny być sortowalne według tej kolumny. Wartość domyślna może się różnić w zależności od typu kolumny. Na przykład element TemplateColumn<TGridItem> jest sortowany, jeśli określono jakikolwiek SortBy parametr.
-
InitialSortDirection: wskazuje kierunek sortowania, jeśli IsDefaultSortColumn ma wartość
true. - IsDefaultSortColumn: wskazuje, czy ta kolumna ma być sortowana domyślnie.
- PlaceholderTemplate: Jeśli określono, zwirtualizowane siatki używają tego szablonu do renderowania komórek, których dane nie zostały załadowane.
- HeaderTemplate: opcjonalny szablon komórki nagłówka tej kolumny. Jeśli nie zostanie określony, domyślny szablon nagłówka zawiera element Title, wraz z odpowiednimi wskaźnikami sortowania i przyciskami opcji.
- Title: tekst tytułu kolumny. Tytuł jest renderowany automatycznie, jeśli HeaderTemplate nie jest używany.
Dodaj na przykład następujący składnik, aby renderować siatkę.
W przypadku
PromotionGrid.razor:
@page "/promotion-grid"
@using Microsoft.AspNetCore.Components.QuickGrid
<PageTitle>Promotion Grid</PageTitle>
<h1>Promotion Grid Example</h1>
<QuickGrid Items="people">
<PropertyColumn Property="@(p => p.PersonId)" Sortable="true" />
<PropertyColumn Property="@(p => p.Name)" Sortable="true" />
<PropertyColumn Property="@(p => p.PromotionDate)" Format="yyyy-MM-dd" Sortable="true" />
</QuickGrid>
@code {
private record Person(int PersonId, string Name, DateOnly PromotionDate);
private IQueryable<Person> people = new[]
{
new Person(10895, "Jean Martin", new DateOnly(1985, 3, 16)),
new Person(10944, "António Langa", new DateOnly(1991, 12, 1)),
new Person(11203, "Julie Smith", new DateOnly(1958, 10, 10)),
new Person(11205, "Nur Sari", new DateOnly(1922, 4, 27)),
new Person(11898, "Jose Hernandez", new DateOnly(2011, 5, 3)),
new Person(12130, "Kenji Sato", new DateOnly(2004, 1, 9)),
}.AsQueryable();
}
@page "/promotion-grid"
@using Microsoft.AspNetCore.Components.QuickGrid
<PageTitle>Promotion Grid</PageTitle>
<h1>Promotion Grid Example</h1>
<QuickGrid Items="people">
<PropertyColumn Property="@(p => p.PersonId)" Sortable="true" />
<PropertyColumn Property="@(p => p.Name)" Sortable="true" />
<PropertyColumn Property="@(p => p.PromotionDate)" Format="yyyy-MM-dd" Sortable="true" />
</QuickGrid>
@code {
private record Person(int PersonId, string Name, DateOnly PromotionDate);
private IQueryable<Person> people = new[]
{
new Person(10895, "Jean Martin", new DateOnly(1985, 3, 16)),
new Person(10944, "António Langa", new DateOnly(1991, 12, 1)),
new Person(11203, "Julie Smith", new DateOnly(1958, 10, 10)),
new Person(11205, "Nur Sari", new DateOnly(1922, 4, 27)),
new Person(11898, "Jose Hernandez", new DateOnly(2011, 5, 3)),
new Person(12130, "Kenji Sato", new DateOnly(2004, 1, 9)),
}.AsQueryable();
}
Uzyskaj dostęp do składnika w przeglądarce w ścieżce względnej /promotion-grid.
Nie ma bieżących planów rozszerzenia QuickGrid o funkcje, które pełnowymiarowe komercyjne siatki zwykle oferują, na przykład wiersze hierarchiczne, przeciąganie kolumn w celu zmiany ich kolejności lub wybór zakresu podobny do tego w Excelu. Jeśli potrzebujesz zaawansowanych funkcji, których nie chcesz tworzyć samodzielnie, kontynuuj korzystanie z sieci innych firm.
Elementy strony ze składnikiem Paginator
Składnik QuickGrid może stronicować dane ze źródła danych.
Składnik QuickGrid może stronicować dane ze źródła danych. W Blazor Web App wymaga się, aby przy stronicowaniu składnik przyjął tryb renderowania interakcyjnego.
Dodaj wystąpienie PaginationState do bloku @code składnika.
ItemsPerPage Ustaw wartość na liczbę elementów do wyświetlenia na stronę. W poniższym przykładzie wystąpienie ma nazwę pagination, a ustawiono dziesięć elementów na stronę.
PaginationState pagination = new PaginationState { ItemsPerPage = 10 };
QuickGrid Ustaw właściwość składnika Pagination na :pagination
<QuickGrid Items="..." Pagination="pagination">
Aby zapewnić interfejs użytkownika do stronicowania, dodaj składnik Paginator powyżej, poniżej lub zarówno powyżej, jak i poniżej składnika QuickGrid. Ustaw Paginator.State na pagination.
Aby udostępnić interfejs użytkownika na potrzeby stronicowania, dodaj Paginator składnik powyżej lub poniżej QuickGrid składnika. Ustaw Paginator.State na pagination.
<Paginator State="pagination" />
W aplikacji przeglądaj elementy za pomocą renderowanego Paginator składnika.
QuickGrid renderuje dodatkowe puste wiersze, aby wypełnić ostatnią stronę danych w przypadku użycia ze składnikiem Paginator. W .NET 9 lub nowszych puste komórki danych (<td></td>) są dodawane do pustych wierszy. Puste wiersze służą ułatwieniu renderowania QuickGrid z zachowaniem stabilnej wysokości wierszy i stylizacji na wszystkich stronach.
GetPageUrl Zwraca adres URL z numerem strony liczonym od 1. Indeks strony 0 (strona 1) pomija całkowicie parametr zapytania.
Tryby stronicowania
QuickGrid Obsługuje nawigację opartą na adresach URL z podziałem na strony i stan sortowania utrwalone przez ciąg zapytania adresu URL. Gdy użytkownicy stronicują lub sortują, adres URL zostanie zaktualizowany (na przykład: ?page=2&sort=Name&direction=asc). Umożliwia to udostępnianie linków, powrót/przekierowanie przeglądarki i statyczne usługi SSR bez interakcyjności.
Sortowalne nagłówki kolumn i kontrolki paginatora są renderowane jako <a> elementy z atrybutami href . Linki obsługują standardowe zachowanie przeglądarki, takie jak otwieranie strony w nowej karcie lub oknie. Element StaticHtmlRenderer renderuje te kotwice. Na każdym żądaniu serwer odczytuje ciąg zapytania w celu określenia bieżącej strony i stanu sortowania — nie jest wymagane środowisko uruchomieniowe języka JavaScript.
Parametry ciągu zapytania:
-
page: Numer strony liczony od 1. Pierwsza strona pomija parametr dla czystych adresów URL. -
sort: tytuł kolumny do sortowania siatki. -
direction: Rosnąco (asc) lub malejąco (desc).
page Jeśli wartość jest źle sformułowana, zero lub ujemna, QuickGrid wyświetla pierwszą stronę. Jeśli wartość jest większa niż liczba dostępnych stron, QuickGrid zostanie wyświetlona ostatnia strona. To zachowanie obowiązuje, gdy siatka odbiera dane z elementu Items lub ItemsProvider.
ItemsProvider musi zwracać dokładną łączną liczbę elementów, aby QuickGrid mogło prawidłowo określić ostatnią stronę.
Zmień nazwę poprzednich parametrów ciągu zapytania za pomocą parametru QueryParameterNameOptions . Aby uzyskać więcej informacji, zobacz sekcję Nazwy parametrów zapytania .
Kolumna sort jest identyfikowana przez właściwość kolumny Title . Kolumny bez elementu Title renderują nieklikalny nagłówek <div>.
QuickGrid odczytuje adres URL podczas inicjalizacji i subskrybuje NavigationManager.LocationChanged, dzięki czemu działają przyciski Wstecz/Dalej w przeglądarce oraz bezpośrednie wpisanie adresu URL. Po usunięciu parametrów sortowania z adresu URL zostanie on przywrócony do domyślnej kolumny sortowania/kierunku.
Uwaga
Wyłączone linki paginacji są oznaczone za pomocą aria-disabled="true", usunięte z kolejności tabulacji za pomocą tabindex="-1" i uczynione nieinteraktywnymi za pomocą pointer-events: none.
Stronicowanie i stan sortowania są zarządzane w pamięci wewnątrz komponentu QuickGrid bez zmiany adresu URL, co nazywa się nawigacją opartą na stanie wewnętrznym. Wymagany jest tryb renderowania interakcyjnego.
Aby wyłączyć nawigację opartą na adresach URL, ustaw przełącznik AppContext tej funkcji na false:
AppContext.SetSwitch(
"Microsoft.AspNetCore.Components.QuickGrid.EnableUrlBasedQuickGridNavigationAndSorting",
false);
Spowoduje to przywrócenie <button> elementów za pomocą @onclick programów obsługi. Wymagany jest tryb renderowania interakcyjnego.
Przełącznik steruje tylko renderowanym elementem HTML (<a> zamiast <button>). Nawet wtedy, gdy jest wyłączony, QuickGrid nadal odczytuje i zapisuje stan do ciągu zapytania adresu URL wewnętrznie.
SortByColumnAsync i Paginator.GoToPageAsync nawigują za pomocą NavigationManager.NavigateTo niezależnie od flagi.
Nazwy parametrów zapytania
Parametr QueryParameterNameOptionsQuickGrid składnika steruje nazwami parametrów ciągu zapytania, które utrwalają stan siatki w adresie URL. Klasa QueryParameterNameOptions ma trzy właściwości konfigurowalne:
-
Sort: nazwa parametru ciągu zapytania, który zawiera kolumnę sortowania. Domyślna wartość tosort. -
Direction: nazwa parametru ciągu zapytania, który zawiera kierunek sortowania. Domyślna wartość todirection. -
Page: nazwa parametru ciągu zapytania, który zawiera numer strony. Domyślna wartość topage.
Parametr nigdy nie ma wartości null. Jeśli parametr nie jest ustawiony, komponent QuickGrid używa instancji utworzonej przez konstruktor bezparametrowy, w wyniku czego używane są domyślne nazwy z powyższej listy.
Konstruktor przyjmuje opcjonalny argument prefiksu, który jest poprzedzony wszystkimi trzema nazwami domyślnymi. Prefiks musi zawierać dowolny znak separatora, który ma być wyświetlany między prefiksem a nazwą. W poniższym przykładzie parametry ciągu zapytania mają nazwę products_sort, products_directioni products_page:
@using Microsoft.AspNetCore.Components.QuickGrid
<QuickGrid ...
QueryParameterNameOptions="@(new QueryParameterNameOptions("products_"))">
...
</QuickGrid>
Aby kontrolować nazwy indywidualnie, ustaw właściwości klasy. Zestaw właściwości jawnie ma pierwszeństwo przed prefiksem przekazanym do konstruktora, więc dwa podejścia można połączyć. W poniższym przykładzie parametry ciągu zapytania mają nazwy orderBy, orderDir i p:
@using Microsoft.AspNetCore.Components.QuickGrid
<QuickGrid ... QueryParameterNameOptions="@queryParameterNames">
...
</QuickGrid>
@code {
private QueryParameterNameOptions queryParameterNames = new()
{
Sort = "orderBy",
Direction = "orderDir",
Page = "p"
};
}
Nazwa parametru zapytania strony jest stosowana względem wystąpienia PaginationState przypisanego do parametru Pagination siatki, więc powiązany komponent Paginator automatycznie odczytuje i zapisuje tę samą nazwę parametru.
Wiele siatek na jednej stronie
Wiele QuickGrid składników na tej samej stronie wymaga unikatowych nazw parametrów zapytania, aby uniknąć konfliktów ciągu zapytania. Przypisz parametr QueryParameterNameOptions do wszystkich siatek z wyjątkiem jednej. Aby uzyskać więcej informacji, zobacz sekcję Nazwy parametrów zapytania .
Każdy QuickGrid musi mieć własną instancję PaginationState. Wiele siatek nie może współdzielić elementu PaginationState, jeśli używają różnych nazw parametrów zapytania — ostatnia renderowana siatka nadpisze nazwę parametru zapytania we współdzielonym stanie, co spowoduje, że Paginator będzie odczytywać dane z niewłaściwego parametru.
W poniższym przykładzie pierwszy QuickGrid używa domyślnych nazw parametrów zapytania, podczas gdy drugi używa prefiksu cities_ :
<QuickGrid ... Pagination="@pagination1">
...
</QuickGrid>
<Paginator State="pagination1" />
<QuickGrid ... Pagination="@pagination2"
QueryParameterNameOptions="@(new QueryParameterNameOptions("cities_"))">
...
</QuickGrid>
<Paginator State="pagination2" />
W następującym ciągu zapytania:
- Część
page=2&sort=Name&direction=ascma zastosowanie do pierwszegoQuickGridskładnika. - Część
cities_page=3&cities_sort=Population&cities_direction=descma zastosowanie do drugiegoQuickGridskładnika.
?page=2&sort=Name&direction=asc&cities_page=3&cities_sort=Population&cities_direction=desc
Zdarzenie kliknięcia wiersza (OnRowClick)
Komponent QuickGrid obsługuje zdarzenia kliknięcia wiersza za pomocą parametru OnRowClick. Po ustawieniu siatka automatycznie stosuje odpowiedni styl (wskaźnik kursora) i wywołuje wywołanie zwrotne za pomocą klikniętego elementu:
@using Microsoft.AspNetCore.Components.QuickGrid
@inject NavigationManager NavigationManager
<QuickGrid Items="@people.AsQueryable()"
OnRowClick="@((Person args) => HandleRowClick(args))">
<PropertyColumn Property="@(p => p.Name)" />
<PropertyColumn Property="@(p => p.Email)" />
</QuickGrid>
@code {
private List<Person> people = new()
{
new(1, "Alice Smith", "alice@example.com", "Engineering"),
new(2, "Bob Johnson", "bob@example.com", "Marketing"),
new(3, "Carol Williams", "carol@example.com", "Engineering"),
};
private void HandleRowClick(Person person)
{
NavigationManager.NavigateTo($"/person/{person.Id}");
}
private record Person(int Id, string Name, string Email, string Department);
}
Ta funkcja zawiera wbudowane style CSS, które za pomocą klasy CSS row-clickable ustawiają kursor wskaźnika dla klikalnych wierszy, zapewniając użytkownikom wyraźną informację wizualną. Klasa jest stosowana do elementu tr każdego wiersza danych, gdy ustawiono OnRowClick, i jest łączona z każdą klasą zwracaną przez parametr RowClass.
Propagacja zdarzeń z interaktywnej treści komórki
Procedura obsługi kliknięcia wiersza jest zarejestrowana na elemencie tr wiersza, więc kliknięcie elementu interaktywnego wewnątrz komórki, takiego jak przycisk, pole wyboru lub łącze, jest propagowane w górę i powoduje również wywołanie OnRowClick. Aby uruchomić tylko własny program obsługi kontrolki, zatrzymaj propagację w kontrolce, używając atrybutu dyrektywy @onclick:stopPropagation:
<QuickGrid Items="@people.AsQueryable()"
OnRowClick="@((Person args) => HandleRowClick(args))">
<PropertyColumn Property="@(p => p.Name)" />
<TemplateColumn Title="Actions">
<button @onclick="@(() => Delete(context))"
@onclick:stopPropagation="true">
Delete
</button>
</TemplateColumn>
</QuickGrid>
Accessibility
OnRowClick jest wygodą opartą na wskaźniku. Zgodnie z projektem nie zmienia semantyki tabeli siatki, więc wiersze nie otrzymują fokusu klawiatury, nie reagują na klawisz Enter lub Spacja i nie są ogłaszane jako interaktywne przez technologie pomocnicze. Uczynienie wiersza elementem, który może otrzymać fokus za pomocą tabindex i role="button", nie jest obsługiwanym obejściem, ponieważ narusza semantykę tabeli, na której polegają technologie wspomagające, aby poruszać się po siatce.
Traktuj kliknięcie wiersza jako skrót dla użytkowników wskaźnika, a nie jedyną ścieżkę do akcji. Dla każdej akcji uruchamianej przez kliknięcie wiersza zapewnij w komórce element sterujący dostępny z klawiatury, na przykład przycisk lub łącze:
<TemplateColumn Title="Details">
<a href="@($"/person/{context.Id}")">View</a>
</TemplateColumn>
Sortuj według kolumny
Składnik QuickGrid może sortować elementy według kolumn. Wybranie nagłówka powoduje przejście do adresu URL ze zaktualizowanymi parametrami sort i direction.
SortByColumnAsync przechodzi przez metodę NavigationManager.NavigateTo(GetSortQueryStringUrl(...)), więc adres URL zawsze odzwierciedla stan sortowania.
Składnik QuickGrid może sortować elementy według kolumn. W Blazor Web App sortowanie wymaga, aby składnik przyjął tryb renderowania interaktywnego.
Dodaj Sortable="true" (Sortable) do tagu PropertyColumn<TGridItem,TProp> :
<PropertyColumn Property="..." Sortable="true" />
W uruchomionej aplikacji posortuj kolumnę QuickGrid , wybierając tytuł renderowanej kolumny.
Stan sortowania w adresie URL używa właściwości kolumny Title jako identyfikatora. Parametr zapytania sort jest ustawiony na column.Title (na przykład dla tytułu kolumny Name: ?sort=Name&direction=asc). Po zmianie adresu URL element QuickGrid dopasowuje wartość sort z powrotem do kolumny, wykonując _columns.FirstOrDefault(c => c.Title == sort.ColumnTitle). Jeśli żaden tytuł kolumny nie jest zgodny, sortowanie jest ignorowane, a siatka wraca do domyślnego sortowania.
Zmiana nazwy kolumny Title to zmiana powodująca niezgodność adresów URL. Wszystkie zakładki lub udostępnione adresy URL zawierające stary tytuł w parametrze sort przestają pasować, a siatka dyskretnie wraca do domyślnego sortowania zamiast sortowania według zamierzonej kolumny. W przypadku PropertyColumn parametr Title domyślnie przyjmuje nazwę właściwości (na przykład: Property="@(p => p.FirstName)" daje Title="First Name"), więc zarówno zmiana nazwy właściwości, jak i jawne ustawienie parametru Title powodują, że istniejące adresy URL przestają działać.
Uwaga
Jeśli chcesz współdzielić klasy arkusza stylów między stronicowaniem opartym na adresie URL a stronicowaniem opartym na stanie wewnętrznym, selektory wskazujące na button.col-title muszą również wskazywać na a.col-title, a nav button/nav button:disabled wymagają nav a/nav a[aria-disabled="true"]. Wbudowany QuickGrid arkusz stylów domyślnie udostępnia oba te elementy.
Otwieranie i wracanie ze strony szczegółowej ze stronicowanym QuickGrid komponentem
Komponent z paginacją QuickGrid może otworzyć stronę szczegółów rekordu i wrócić do właściwej strony wyników, korzystając z podejścia opisanego w tej sekcji. Nawigacja oparta na adresach URL służy do zapisywania numeru strony i zwracania użytkownika do tej samej strony elementów ze strony szczegółów.
Komponent z paginacją QuickGrid może otworzyć stronę szczegółów rekordu i wrócić do właściwej strony wyników, korzystając z podejścia opisanego w tej sekcji.
Uwaga
Podejście opisane w tej sekcji jest uproszczone przez nawigację opartą na adresach URL w .NET 11 lub nowszym. Aby uzyskać więcej informacji, zobacz tę sekcję w .NET 11 lub nowszej wersji tego artykułu.
Używany jest następujący interfejs API:
- PaginationState.CurrentPageIndex: Pobiera bieżący indeks strony oparty na zerach.
-
PaginationState.SetCurrentPageIndexAsync: Ustawia bieżący indeks strony i powiadamia wszystkie powiązane komponenty
QuickGrid, aby pobrały i wyrenderowały zaktualizowane dane.
Komponent Details otrzymuje numer strony z ciągu zapytania we właściwości Page i używa go do utworzenia linku prowadzącego z powrotem do komponentu QuickGrid pod adresem /scifi-characters.
Details.razor:
@page "/details"
<ul>
<li>Character ID for this detail record: @Id</li>
<li>QuickGrid page number: @Page</li>
</ul>
<div>
@if (Page.HasValue)
{
<a href="@($"/scifi-characters?page={Page}")">Back to List</a>
}
else
{
<a href="/scifi-characters">Back to List</a>
}
</div>
@code {
[SupplyParameterFromQuery]
private int? Id { get; set; }
[SupplyParameterFromQuery]
private int? Page { get; set; }
}
Składnik SciFiCharacters :
- Automatycznie ustawia stronicowanie składnika podczas inicjalizacji składnika
QuickGridprzy użyciu nawigacji opartej na adresie URL, która ustawia indeks strony na podstawie wartości parametrupageciągu zapytania, jeśli istnieje. - Otwiera poprzedzający komponent
Detailsz bieżącym numerem strony, który jest równy bieżącemu indeksowi strony (CurrentPageIndex) powiększonemu o jeden, aby uzyskać indeks zaczynający się od 1 w parametrach zapytania. Indeks zaczynający się od 1 dla parametru ciągu zapytaniapageodpowiada renderowanemu w interfejsie użytkownika numerowi strony zaczynającemu się od 1 w renderowanym składnikuPaginator.
ScifiCharacters.razor:
@page "/scifi-characters"
@using Microsoft.AspNetCore.Components.QuickGrid
@inject NavigationManager Navigation
<QuickGrid Items="characters" Pagination="pagination"
OnRowClick="@((Character args) => HandleRowClick(args))">
<PropertyColumn Property="@(c => c.Id)" />
<PropertyColumn Property="@(c => c.Name)" />
</QuickGrid>
<Paginator State="pagination" />
@code {
PaginationState pagination = new PaginationState { ItemsPerPage = 3 };
private record Character(int Id, string Name);
private IQueryable<Character> characters = new[]
{
new Character(0, "Ellen Ripley"),
new Character(1, "Darth Vader"),
new Character(2, "Rick Deckard"),
new Character(3, "Sarah Connor"),
new Character(4, "Malcolm Reynolds"),
new Character(5, "Kara Thrace"),
new Character(6, "James Kirk"),
new Character(7, "Flash Gordon"),
new Character(8, "Max Rockatansky"),
new Character(9, "Katniss Everdeen"),
new Character(10, "Ellie Sattler"),
new Character(11, "Leela")
}.AsQueryable();
private void HandleRowClick(Character character)
{
Navigation.NavigateTo(
$"/details?id={character.Id}&page={pagination.CurrentPageIndex + 1}");
}
}
Jeśli komponent QuickGrid ustawia QueryParameterNameOptions, ustaw klucz parametru w ciągu zapytania dla strony wyników w komponencie Details tak, aby odpowiadał właściwości Page opcji. W poniższym przykładzie do komponentu QuickGrid przypisano wystąpienie QueryParameterNameOptions z prefiksem scifi-characters-quickgrid_, co skutkuje utworzeniem parametru ciągu zapytania strony o nazwie scifi-characters-quickgrid_page.
W pliku Characters.razor:
<QuickGrid ...
QueryParameterNameOptions="@(new QueryParameterNameOptions("scifi-characters-quickgrid_"))">
W pliku Details.razor:
<a href="@($"/scifi-characters?scifi-characters-quickgrid_page={Page}")">Back to List</a>
Uwaga
Aby wyłączyć nawigację opartą na adresach URL, ustaw następującą flagę funkcji w pliku aplikacji Program :
AppContext.SetSwitch(
"Microsoft.AspNetCore.Components.QuickGrid.EnableUrlBasedQuickGridNavigationAndSorting",
false);
- Ustawia stronicowanie komponentu
QuickGridprzez wywołanie PaginationState.SetCurrentPageIndexAsync podczas inicjalizacji komponentu, ustawiając indeks strony na wartośćPage(numer strony) minus jeden (-1).pageParametr ciągu zapytania jest usuwany po ustawieniu indeksu strony przy użyciu parametrów NavigateTo iGetUriWithQueryParameter. - Otwiera poprzedzający komponent
Detailsz bieżącym numerem strony, z indeksem strony zwiększonym o jeden (+1), aby wartość była indeksem liczonym od 1 (CurrentPageIndex) w ciągu zapytania. Indeks zaczynający się od 1 dla parametru ciągu zapytaniapageodpowiada renderowanemu w interfejsie użytkownika numerowi strony zaczynającemu się od 1 w renderowanym składnikuPaginator.
ScifiCharacters.razor:
@page "/scifi-characters"
@rendermode InteractiveServer
@using Microsoft.AspNetCore.Components.QuickGrid
@inject NavigationManager Navigation
<QuickGrid Items="characters" Pagination="pagination">
<PropertyColumn Property="@(c => c.Id)" />
<PropertyColumn Property="@(c => c.Name)" />
<TemplateColumn Context="c">
<a href="@($"/details?id={c.Id}&page={pagination.CurrentPageIndex + 1}")">
Details
</a>
</TemplateColumn>
</QuickGrid>
<Paginator State="pagination" />
@code {
PaginationState pagination = new PaginationState { ItemsPerPage = 3 };
private record Character(int Id, string Name);
private IQueryable<Character> characters = new[]
{
new Character(0, "Ellen Ripley"),
new Character(1, "Darth Vader"),
new Character(2, "Rick Deckard"),
new Character(3, "Sarah Connor"),
new Character(4, "Malcolm Reynolds"),
new Character(5, "Kara Thrace"),
new Character(6, "James Kirk"),
new Character(7, "Flash Gordon"),
new Character(8, "Max Rockatansky"),
new Character(9, "Katniss Everdeen"),
new Character(10, "Ellie Sattler"),
new Character(11, "Leela")
}.AsQueryable();
[SupplyParameterFromQuery]
private int? Page { get; set; }
protected override async Task OnInitializedAsync()
{
if (Page.HasValue && Page > 0)
{
await pagination.SetCurrentPageIndexAsync(Page.Value - 1);
Navigation.NavigateTo(
Navigation.GetUriWithQueryParameter("page", (int?)null));
}
}
}
Zastosuj style wierszy
Stosowanie stylów do wierszy z wykorzystaniem izolacji CSS, co może obejmować stylizowanie pustych wierszy dla składników QuickGrid, które stronicują dane za pomocą składnika Paginator.
Zawij komponent QuickGrid w elemencie blokowym, na przykład jako <div>.
+ <div>
<QuickGrid ...>
...
</QuickGrid>
+ </div>
Zastosuj styl wiersza przy użyciu ::deeppseudo-elementu. W poniższym przykładzie wysokość wiersza jest ustawiona na 2em, w tym dla pustych wierszy danych.
{COMPONENT}.razor.css:
::deep tr {
height: 2em;
}
Alternatywnie należy użyć następującego podejścia do stylów CSS:
- Wyświetl komórki wierszy wypełnione danymi.
- Nie wyświetlaj pustych komórek w wierszach, aby uniknąć renderowania obramowań tych komórek, co wynika ze stylizacji Bootstrap.
{COMPONENT}.razor.css:
::deep tr:has(> td:not(:empty)) > td {
display: table-cell;
}
::deep td:empty {
display: none;
}
Aby uzyskać więcej informacji na temat używania ::deeppseudo-elements z izolacją CSS, zobacz ASP.NET Core Blazor izolacja CSS.
Atrybuty niestandardowe i style
QuickGrid obsługuje również przekazywanie atrybutów niestandardowych i klas stylów (Class) do renderowanego elementu tabeli:
<QuickGrid Items="..." custom-attribute="value" Class="custom-class">
Sformatuj wiersz tabeli na podstawie elementu wiersza
Zastosuj klasę arkusza stylów do wiersza siatki, wykorzystując do tego parametr RowClass, w zależności od elementu wiersza.
W poniższym przykładzie:
- Element wiersza jest reprezentowany przez rekord
Person. RekordPersonzawiera właściwośćFirstName. - Metoda
GetRowCssClassstosuje style klasyhighlight-rowdo dowolnego wiersza, w którym imię osoby to "Julie".
<QuickGrid ... RowClass="GetRowCssClass">
...
</QuickGrid>
@code {
private record Person(int PersonId, string FirstName, string LastName);
private string GetRowCssClass(Person person) =>
person.FirstName == "Julie" ? "highlight-row" : null;
}
Zamknij opcje kolumny QuickGrid
Zamknij interfejs użytkownika opcji kolumny QuickGrid za pomocą metody HideColumnOptionsAsync.
Poniższy przykład zamyka interfejs użytkownika opcji kolumn natychmiast po zastosowaniu filtru tytułu:
<QuickGrid @ref="movieGrid" Items="movies">
<PropertyColumn Property="@(m => m.Title)" Title="Title">
<ColumnOptions>
<input type="search" @bind="titleFilter" placeholder="Filter by title"
@bind:after="@(() => movieGrid.HideColumnOptionsAsync())" />
</ColumnOptions>
</PropertyColumn>
<PropertyColumn Property="@(m => m.Genre)" Title="Genre" />
<PropertyColumn Property="@(m => m.ReleaseYear)" Title="Release Year" />
</QuickGrid>
@code {
private QuickGrid<Movie>? movieGrid;
private string titleFilter = string.Empty;
private IQueryable<Movie> movies = new List<Movie> { ... }.AsQueryable();
private IQueryable<Movie> filteredMovies =>
movies.Where(m => m.Title!.Contains(titleFilter));
}
źródło danych Entity Framework Core (EF Core)
Użyj wzorca fabryki, aby rozpoznać EF Core kontekst bazy danych, który dostarcza dane do QuickGrid składnika. Aby uzyskać więcej informacji na temat zalecanego wzorca fabryki, zobacz ASP.NET Core Blazor z Entity Framework Core (EF Core).
Fabrykę kontekstu bazy danych (IDbContextFactory<TContext>) wstrzykuje się do składnika za pomocą dyrektywy @inject. Podejście fabryczne wymaga usunięcia kontekstu bazy danych, więc składnik implementuje IAsyncDisposable interfejs z dyrektywą @implements . Dostawca elementu dla składnika QuickGrid jest DbSet<T> uzyskanym z utworzonego kontekstu bazy danych (CreateDbContext) fabryki wstrzykniętego kontekstu bazy danych.
QuickGrid rozpoznaje wystąpienia IQueryable dostarczone przez platformę EF i wie, jak rozwiązywać zapytania asynchronicznie pod kątem wydajności.
Dodaj odwołanie do pakietu Microsoft.AspNetCore.Components.QuickGrid.EntityFrameworkAdapter NuGet.
Uwaga
Aby uzyskać wskazówki dotyczące dodawania pakietów do aplikacji .NET, zobacz artykuły w Install and manage packages at Package consumption workflow (dokumentacja NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.
Wywołaj AddQuickGridEntityFrameworkAdapter kolekcję usług w pliku w Program celu zarejestrowania implementacji obsługującej IAsyncQueryExecutor platformę EF:
builder.Services.AddQuickGridEntityFrameworkAdapter();
W poniższym przykładzie użyto ExampleTableDbSet<TEntity> (tabeli) z AppDbContext kontekstu bazy danych (context) jako źródła danych dla QuickGrid komponentu:
@using Microsoft.AspNetCore.Components.QuickGrid
@using Microsoft.EntityFrameworkCore
@implements IAsyncDisposable
@inject IDbContextFactory<AppDbContext> DbFactory
...
<QuickGrid ... Items="context.ExampleTable" ...>
...
</QuickGrid>
@code {
private AppDbContext context = default!;
protected override void OnInitialized()
{
context = DbFactory.CreateDbContext();
}
public async ValueTask DisposeAsync() => await context.DisposeAsync();
}
W bloku kodu (@code) poprzedniego przykładu:
- Pole
contextzawiera kontekst bazy danych, wpisany jakoAppDbContext. - Metoda
OnInitializedcyklu życia przypisuje nowy kontekst bazy danych (CreateDbContext) do polacontextpochodzącego z wstrzykniętej fabryki (DbFactory). - Metoda asynchroniczna
DisposeAsyncusuwa kontekst bazy danych po usunięciu składnika.
Możesz również użyć dowolnego operatora LINQ obsługiwanego przez platformę EF do filtrowania danych przed przekazaniem ich do parametru Items .
Poniższy przykład filtruje filmy według tytułu filmu wprowadzonego w polu wyszukiwania. Kontekst bazy danych to BlazorWebAppMoviesContext, a model jest Movie. Właściwość filmu Title jest wykorzystywana do filtrowania.
@using Microsoft.AspNetCore.Components.QuickGrid
@using Microsoft.EntityFrameworkCore
@implements IAsyncDisposable
@inject IDbContextFactory<BlazorWebAppMoviesContext> DbFactory
...
<p>
<input type="search" @bind="titleFilter" @bind:event="oninput" />
</p>
<QuickGrid ... Items="FilteredMovies" ...>
...
</QuickGrid>
@code {
private string titleFilter = string.Empty;
private BlazorWebAppMoviesContext context = default!;
protected override void OnInitialized()
{
context = DbFactory.CreateDbContext();
}
private IQueryable<Movie> FilteredMovies =>
context.Movie.Where(m => m.Title!.Contains(titleFilter));
public async ValueTask DisposeAsync() => await context.DisposeAsync();
}
Aby zapoznać się z działającym przykładem, zobacz następujące zasoby:
- Samouczek dotyczący tworzenia Blazor aplikacji bazy danych filmów
-
Blazor przykładowa aplikacja bazy danych filmów: wybierz folder najnowszej wersji w repozytorium. Przykładowy folder projektu samouczka nosi nazwę
BlazorWebAppMovies.
Obsługa nazw ekranowych
Tytuł kolumny można przypisać przy użyciu ColumnBase<TGridItem>.Title w tagu PropertyColumn<TGridItem,TProp>. W poniższym przykładzie filmu kolumna dla danych daty premiery filmu ma nazwę "Release Date".
<PropertyColumn Property="movie => movie.ReleaseDate" Title="Release Date" />
Jednak zarządzanie tytułami kolumn (nazwami) z powiązanych właściwości modelu jest zwykle lepszym wyborem do obsługi aplikacji. Model może kontrolować nazwę wyświetlaną właściwości za pomocą atrybutu [Display]. W poniższym przykładzie model określa nazwę wyświetlaną daty wydania filmu "Release Date" dla jego właściwości ReleaseDate.
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
Aby umożliwić składnikowi QuickGrid użycie właściwości DisplayAttribute.Name, utwórz podklasę PropertyColumn<TGridItem,TProp>, albo w składniku, albo w oddzielnej klasie. Wywołaj metodę GetName, aby zwrócić zlokalizowaną wartość DisplayAttribute.Name, jeśli nielokalizowany DisplayName ([DisplayName] atrybut) nie zawiera wartości:
public class DisplayNameColumn<TGridItem, TProp> : PropertyColumn<TGridItem, TProp>
{
protected override void OnParametersSet()
{
if (Title is null && Property.Body is MemberExpression memberExpression)
{
var memberInfo = memberExpression.Member;
Title =
memberInfo.GetCustomAttribute<DisplayNameAttribute>().DisplayName ??
memberInfo.GetCustomAttribute<DisplayAttribute>().GetName() ??
memberInfo.Name;
}
base.OnParametersSet();
}
}
Użyj podklasy w składniku QuickGrid . W poniższym przykładzie użyto poprzedzającego DisplayNameColumn. Nazwa "Release Date" jest dostarczana przez [Display] atrybut w modelu, więc nie ma potrzeby określania elementu Title:
<DisplayNameColumn Property="movie => movie.ReleaseDate" />
Atrybut [DisplayName] jest również obsługiwany:
[DisplayName("Release Date")]
public DateTime ReleaseDate { get; set; }
Jednak atrybut [Display] jest zalecany, ponieważ udostępnia dodatkowe właściwości. Na przykład [Display] atrybut oferuje możliwość przypisania typu zasobu do lokalizacji.
Dane zdalne
W Blazor WebAssembly aplikacjach pobieranie danych z internetowego interfejsu API opartego na formacie JSON na serwerze jest typowym wymaganiem. Aby pobrać tylko dane wymagane dla bieżącej strony/widoku danych i zastosować sortowanie lub filtrowanie na poziomie serwera, użyj parametru ItemsProvider.
ItemsProvider można również użyć w aplikacji po stronie Blazor serwera, jeśli aplikacja jest wymagana do wykonywania zapytań dotyczących zewnętrznego punktu końcowego lub w innych przypadkach, w których wymagania nie są objęte programem IQueryable.
Podaj wywołanie zwrotne zgodne z typem delegata GridItemsProvider<TGridItem>, gdzie TGridItem jest typem danych wyświetlanych w tabeli. Wywołanie zwrotne otrzymuje parametr typu GridItemsProviderRequest<TGridItem>, który wskazuje na indeks początkowy, maksymalną liczbę wierszy oraz kolejność sortowania danych do zwrócenia. Oprócz zwracania pasujących elementów całkowita liczba elementów (totalItemCount) jest również wymagana do poprawnego działania stronicowania i wirtualizacji.
Poniższy przykład pobiera dane z publicznej bazy OpenFDA Food Enforcement.
GridItemsProvider<TGridItem> konwertuje GridItemsProviderRequest<TGridItem> na zapytanie do bazy danych OpenFDA. Parametry zapytania są tłumaczone na określony format adresu URL obsługiwany przez zewnętrzny interfejs API JSON. Sortowanie i filtrowanie można wykonywać tylko za pomocą sortowania i filtrowania obsługiwanego przez zewnętrzny interfejs API. Punkt końcowy OpenFDA nie obsługuje sortowania, więc żadna z kolumn nie jest oznaczona jako sortowalna. Jednak obsługuje pomijanie rekordów (skip parametru) i ograniczanie zwracania rekordów (limit parametru), więc składnik może włączyć wirtualizację i szybko przewijać dziesiątki tysięcy rekordów.
FoodRecalls.razor:
@page "/food-recalls"
@inject HttpClient Http
@inject NavigationManager Navigation
<PageTitle>Food Recalls</PageTitle>
<h1>OpenFDA Food Recalls</h1>
<div class="grid" tabindex="-1">
<QuickGrid ItemsProvider="@foodRecallProvider" Virtualize="true">
<PropertyColumn Title="ID" Property="@(c => c.Event_Id)" />
<PropertyColumn Property="@(c => c.State)" />
<PropertyColumn Property="@(c => c.City)" />
<PropertyColumn Title="Company" Property="@(c => c.Recalling_Firm)" />
<PropertyColumn Property="@(c => c.Status)" />
</QuickGrid>
</div>
<p>Total: <strong>@numResults results found</strong></p>
@code {
private GridItemsProvider<FoodRecall>? foodRecallProvider;
private int numResults;
protected override async Task OnInitializedAsync()
{
foodRecallProvider = async req =>
{
var url = Navigation.GetUriWithQueryParameters(
"https://api.fda.gov/food/enforcement.json",
new Dictionary<string, object?>
{
{ "skip", req.StartIndex },
{ "limit", req.Count },
});
using var response = await Http.GetFromJsonAsync<FoodRecallQueryResult>(
url, req.CancellationToken);
return GridItemsProviderResult.From(
items: response!.Results,
totalItemCount: response!.Meta.Results.Total);
};
numResults = (await Http.GetFromJsonAsync<FoodRecallQueryResult>(
"https://api.fda.gov/food/enforcement.json"))!.Meta.Results.Total;
}
}
Aby uzyskać więcej informacji na temat wywoływania internetowych interfejsów API, zobacz Wywołanie internetowego interfejsu API z aplikacji ASP.NET CoreBlazor.
QuickGrid rusztowanie
Narzędzie QuickGrid jest używane do tworzenia szkieletów komponentów Razor za pomocą QuickGrid w celu wyświetlania danych z bazy danych.
Szkielet generuje podstawowe strony tworzenia, odczytu, aktualizacji i usuwania (CRUD) na podstawie modelu danych Entity Framework Core. Można szkieletować poszczególne strony lub wszystkie strony CRUD. Wybierasz klasę modelu i DbContext, opcjonalnie tworząc nowy DbContext, jeśli to konieczne.
Składniki szkieletowe Razor są dodawane do projektu w wygenerowanym folderze o nazwie po klasie modelu. Wygenerowany Index składnik używa QuickGrid składnika do wyświetlania danych. Dostosuj wygenerowane składniki zgodnie z potrzebami i włącz interakcyjność, aby korzystać z interaktywnych funkcji, takich jak stronicowanie, sortowanie i filtrowanie .
Komponenty produkowane przez system rusztowań wymagają renderowania po stronie serwera (SSR), dlatego nie są obsługiwane na WebAssembly.
- Visual Studio
- Visual Studio Code
- interfejs wiersza polecenia .NET CLI
Kliknij prawym przyciskiem myszy na Components/Pages folder i wybierz Dodaj>Nowy element szkieletowy.
Po otwarciu okna dialogowego
CRUD to skrót od tworzenia, odczytu, aktualizacji i usuwania. Szkieletor aplikacji tworzy komponenty do tworzenia, edytowania, usuwania, wyświetlania detali i indeksowania.
Ukończ okno dialogowe Dodawanie Razor składników przy użyciu programu Entity Framework (CRUD):
- Lista rozwijana Szablon zawiera inne szablony służące do tworzenia, edytowania, usuwania, wyświetlania szczegółów oraz organizowania listy składników. Ta lista rozwijana jest przydatna, gdy trzeba utworzyć tylko określony rodzaj szkieletu składnika dla klasy modelu. Pozostaw rozwijaną listę Szablon ustawioną na CRUD, aby utworzyć szkielet pełnego zestawu komponentów.
- Z listy rozwijanej Klasa modelu wybierz klasę modelu. Folder jest tworzony dla składników wygenerowanych z modelu o nazwie (jeśli klasa modelu nosi nazwę
Movie, folder jest automatycznie nazywanyMoviePages). - W przypadku klasy DbContext , zastosuj jedno z następujących podejść:
- Wybierz istniejącą DbContext klasę.
-
+ Wybierz przycisk (znak plus) i użyj modalnego okna dialogowego Dodawanie kontekstu danych, aby podać nową DbContext nazwę klasy. Generator rejestruje nowy kontekst przy użyciu dostawcy fabryki zamiast używać typu kontekstu bezpośrednio jako rejestracji usługi oraz w razie potrzeby aktualizuje istniejącą rejestrację
ApplicationDbContext, aby korzystała z dostawcy fabryki.
- Po zamknięciu okna dialogowego modelu lista rozwijana dostawcy bazy danych domyślnie ustawiana jest na SQL Server. Możesz wybrać odpowiedniego dostawcę dla używanej bazy danych. Opcje obejmują SQL Server, SQLite, PostgreSQL i Azure Cosmos DB.
- Wybierz Dodaj.
Zobacz, jak użyć narzędzia scaffolderQuickGrid, w przykładzie Blazor.
Wiele współbieżnych zapytań EF Core uruchamia System.InvalidOperationException
Wiele współbieżnych zapytań EF Core może wyzwolić następujące System.InvalidOperationException:
System.InvalidOperationException: Druga operacja została uruchomiona w tym wystąpieniu kontekstu przed zakończeniem poprzedniej operacji. Jest to zwykle spowodowane przez różne wątki, które współbieżnie używają tego samego wystąpienia DbContext. Aby uzyskać więcej informacji na temat unikania problemów z wątkami w dbContext, zobacz https://go.microsoft.com/fwlink/?linkid=2097913.
Ten scenariusz jest zaplanowany na poprawę w nadchodzącej wersji ASP.NET Core. Aby uzyskać więcej informacji, zobacz [Blazor] Ulepsz doświadczenie z QuickGrid i EF Core (dotnet/aspnetcore #58716).
W międzyczasie możesz rozwiązać problem za pomocą ItemsProvider z tokenem anulowania. Token anulowania uniemożliwia równoczesne zapytania, anulując poprzednie żądanie po wydaniu nowego żądania.
Rozważmy poniższy przykład, który jest oparty na komponencie bazy danych filmów Index dla Zbuduj aplikację bazy danych filmów Blazor (Omówienie) samouczka. Wersję uproszczoną zintegrowaną w przykładowej aplikacji można zobaczyć w artykule . Składnik Index osadzony w aplikacji jest zastępowany przez następujący element.
Components/Pages/MoviePages/Index.razor:
@page "/movies"
@rendermode InteractiveServer
@using Microsoft.EntityFrameworkCore
@using Microsoft.AspNetCore.Components.QuickGrid
@using BlazorWebAppMovies.Models
@using BlazorWebAppMovies.Data
@inject IDbContextFactory<BlazorWebAppMovies.Data.BlazorWebAppMoviesContext> DbFactory
<PageTitle>Index</PageTitle>
<h1>Index</h1>
<div>
<input type="search" @bind="titleFilter" @bind:event="oninput" />
</div>
<p>
<a href="movies/create">Create New</a>
</p>
<div>
<QuickGrid Class="table" TGridItem="Movie" ItemsProvider="GetMovies"
ItemKey="(x => x.Id)" Pagination="pagination">
<PropertyColumn Property="movie => movie.Title" Sortable="true" />
<PropertyColumn Property="movie => movie.ReleaseDate" Title="Release Date" />
<PropertyColumn Property="movie => movie.Genre" />
<PropertyColumn Property="movie => movie.Price" />
<PropertyColumn Property="movie => movie.Rating" />
<TemplateColumn Context="movie">
<a href="@($"movies/edit?id={movie.Id}")">Edit</a> |
<a href="@($"movies/details?id={movie.Id}")">Details</a> |
<a href="@($"movies/delete?id={movie.Id}")">Delete</a>
</TemplateColumn>
</QuickGrid>
</div>
<Paginator State="pagination" />
@code {
private BlazorWebAppMoviesContext context = default!;
private PaginationState pagination = new PaginationState { ItemsPerPage = 5 };
private string titleFilter = string.Empty;
public async ValueTask<GridItemsProviderResult<Movie>> GetMovies(GridItemsProviderRequest<Movie> request)
{
using var context = DbFactory.CreateDbContext();
var totalCount = await context.Movie.CountAsync(request.CancellationToken);
IQueryable<Movie> query = context.Movie.OrderBy(x => x.Id);
query = request.ApplySorting(query).Skip(request.StartIndex);
if (request.Count.HasValue)
{
query = query.Take(request.Count.Value);
}
var items = await query.ToArrayAsync(request.CancellationToken);
var result = new GridItemsProviderResult<Movie>
{
Items = items,
TotalItemCount = totalCount
};
return result;
}
}