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.
Pobierz przykładowy projekt Wingtip Toys (C#) lub pobierz książkę elektroniczną (PDF)
W tej serii samouczków przedstawiono podstawy tworzenia aplikacji ASP.NET Web Forms przy użyciu ASP.NET 4.5 i Microsoft Visual Studio Express 2013 for Web. Projekt programu Visual Studio 2013 z kodem źródłowym języka C# jest dostępny do dołączenia do tej serii samouczków.
W tym samouczku zmodyfikujesz przykładową aplikację Wingtip Toys w celu obsługi routingu adresów URL. Routing umożliwia aplikacji internetowej korzystanie z przyjaznych adresów URL, łatwiejszych do zapamiętania i lepszej obsługi przez wyszukiwarki. Ten samouczek opiera się na poprzednim samouczku "Członkostwo i administracja" i jest częścią serii samouczków Wingtip Toys.
Czego nauczysz się:
- Jak zarejestrować trasy dla aplikacji ASP.NET Web Forms.
- Jak dodać trasy do strony internetowej.
- Jak wybrać dane z bazy danych do obsługi tras.
Omówienie routingu ASP.NET
Routing adresów URL umożliwia skonfigurowanie aplikacji do akceptowania adresów URL żądań, które nie są mapowane na pliki fizyczne. Adres URL żądania to po prostu adres URL, który użytkownik wprowadza w przeglądarce, aby znaleźć stronę w witrynie internetowej. Routing służy do definiowania adresów URL, które są semantycznie istotne dla użytkowników i które mogą pomóc w optymalizacji aparatu wyszukiwania (SEO).
Domyślnie szablon formularzy internetowych zawiera ASP.NET przyjazne adresy URL. Większość podstawowych prac routingu zostanie zaimplementowana przy użyciu przyjaznych adresów URL. Jednak w tym samouczku dodasz dostosowane funkcjonalności routingu.
Przed dostosowaniem routingu adresów URL przykładowa aplikacja Wingtip Toys może połączyć się z produktem przy użyciu następującego adresu URL:
https://localhost:44300/ProductDetails.aspx?productID=2
Dostosowując routing adresu URL, aplikacja demonstracyjna Wingtip Toys będzie łączyć się z tym samym produktem przy użyciu łatwiejszego do odczytania adresu URL.
https://localhost:44300/Product/Convertible%20Car
Trasy
Trasa to wzorzec adresu URL mapowany na procedurę obsługi. Procedura obsługi może być plikiem fizycznym, takim jak plik .aspx w aplikacji Web Forms. Obsługujący może być również klasą przetwarzającą żądanie. Aby zdefiniować trasę, należy utworzyć wystąpienie klasy Route, określając wzorzec adresu URL, procedurę obsługi i opcjonalnie nazwę trasy.
Dodajesz trasę do aplikacji, dodając obiekt Route do statycznej właściwości Routes klasy RouteTable. Właściwość Routes to RouteCollection obiekt, który przechowuje wszystkie trasy dla aplikacji.
Wzorce adresów URL
Wzorzec adresu URL może zawierać dosłowne wartości oraz symbole zastępcze dla zmiennych (zwane parametrami adresu URL). Literały i symbole zastępcze znajdują się w segmentach adresu URL, które są rozdzielane znakiem ukośnika (/).
Po wysłaniu żądania do aplikacji internetowej adres URL jest analizowany w segmentach i symbolach zastępczych, a wartości zmiennych są dostarczane do procedury obsługi żądań. Ten proces jest podobny do sposobu, w jaki dane w ciągu zapytania są analizowane i przekazywane do obsługi żądania. W obu przypadkach informacje o zmiennej są uwzględniane w adresie URL i przekazywane do programu obsługi w postaci par klucz-wartość. W przypadku ciągów zapytania zarówno klucze, jak i wartości znajdują się w adresie URL. W przypadku tras klucze są nazwami zastępczymi zdefiniowanymi we wzorcu adresu URL, a tylko wartości znajdują się w adresie URL.
We wzorcu adresu URL definiujesz symbole zastępcze, umieszczając je w nawiasach klamrowych ( { i } ). Można zdefiniować więcej niż jeden symbol zastępczy w segmencie, ale symbole zastępcze muszą być oddzielone wartością literału. Na przykład {language}-{country}/{action} jest prawidłowym wzorcem trasy. Jednak {language}{country}/{action} nie jest prawidłowym wzorcem, ponieważ nie ma wartości dosłownej ani ogranicznika między elementami zastępczymi. W związku z tym routing nie może określić, gdzie należy oddzielić wartość symbolu języka od wartości symbolu kraju.
Mapowanie i rejestrowanie tras
Przed dołączeniem tras do stron przykładowej aplikacji Wingtip Toys należy zarejestrować trasy po uruchomieniu aplikacji. Aby zarejestrować trasy, zmodyfikujesz program obsługi zdarzeń Application_Start .
W Eksploratorze rozwiązańprogramu Visual Studio znajdź i otwórz plik Global.asax.cs .
Dodaj kod wyróżniony kolorem żółtym do pliku Global.asax.cs w następujący sposób:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Optimization; using System.Web.Routing; using System.Web.Security; using System.Web.SessionState; using System.Data.Entity; using WingtipToys.Models; using WingtipToys.Logic; namespace WingtipToys { public class Global : HttpApplication { void Application_Start(object sender, EventArgs e) { // Code that runs on application startup RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // Initialize the product database. Database.SetInitializer(new ProductDatabaseInitializer()); // Create custom role and user. RoleActions roleActions = new RoleActions(); roleActions.AddUserAndRole(); // Add Routes. RegisterCustomRoutes(RouteTable.Routes); } void RegisterCustomRoutes(RouteCollection routes) { routes.MapPageRoute( "ProductsByCategoryRoute", "Category/{categoryName}", "~/ProductList.aspx" ); routes.MapPageRoute( "ProductByNameRoute", "Product/{productName}", "~/ProductDetails.aspx" ); } } }
Po uruchomieniu przykładowej aplikacji Wingtip Toys wywołuje procedurę obsługi zdarzenia Application_Start. Na końcu tego programu obsługi zdarzeń wywoływana jest metoda RegisterCustomRoutes. Metoda RegisterCustomRoutes dodaje każdą trasę, wywołując metodę MapPageRoute obiektu RouteCollection. Trasy są definiowane przy użyciu nazwy trasy, adresu URL trasy i fizycznego adresu URL.
Pierwszy parametr ("ProductsByCategoryRoute") jest nazwą trasy. Służy do wywoływania trasy, gdy jest to potrzebne. Drugi parametr ("Category/{categoryName}") definiuje przyjazny adres URL zastępczy, który może być dynamiczny na podstawie kodu. Używasz tej ścieżki podczas wypełniania kontroli danych za pomocą linków generowanych na podstawie danych. Trasa jest wyświetlana w następujący sposób:
routes.MapPageRoute(
"ProductsByCategoryRoute",
"Category/{categoryName}",
"~/ProductList.aspx"
);
Drugi parametr trasy zawiera dynamiczną wartość, która jest określona w nawiasach klamrowych ({ }). W tym przypadku categoryName to zmienna, która będzie używana do określania właściwej ścieżki routingu.
Uwaga / Notatka
Fakultatywny
Możesz łatwiej zarządzać kodem, przenosząc metodę RegisterCustomRoutes do oddzielnej klasy. W folderze Logika utwórz oddzielną RouteActions klasę. Przenieś powyższą RegisterCustomRoutes metodę z pliku Global.asax.cs do nowej RoutesActions klasy.
RoleActions Użyj klasy i createAdmin metody jako przykładu wywoływania RegisterCustomRoutes metody z pliku Global.asax.cs.
Być może również zauważyłeś/aś wywołanie metody za pomocą obiektu RouteConfig na początku procedury obsługi zdarzenia Application_Start. To wywołanie jest wykonywane w celu zaimplementowania domyślnego routingu. Został on dołączony jako kod domyślny podczas tworzenia aplikacji przy użyciu szablonu formularzy internetowych programu Visual Studio.
Pobieranie i używanie danych trasy
Jak wspomniano powyżej, trasy można zdefiniować. Kod dodany do Application_Start procedury obsługi zdarzeń w pliku Global.asax.cs ładuje trasy, które można definiować.
Ustawianie tras
Trasy wymagają dodania dodatkowego kodu. W tym samouczku użyjesz powiązania modelu, aby pobrać obiekt RouteValueDictionary, który jest używany podczas generowania tras przy użyciu danych z kontrolera danych. Obiekt RouteValueDictionary będzie zawierać listę nazw produktów należących do określonej kategorii produktów. Dla każdego produktu tworzony jest link na podstawie danych i trasy.
Włączanie tras dla kategorii i produktów
Następnie zaktualizujesz aplikację, aby użyć ProductsByCategoryRoute do określenia poprawnej trasy do uwzględnienia dla każdego linku kategorii produktów. Zaktualizujesz również stronę ProductList.aspx , aby uwzględnić link kierowany dla każdego produktu. Linki będą wyświetlane tak, jak były przed zmianą, jednak linki będą teraz używać routingu adresów URL.
W Eksploratorze rozwiązań otwórz stronę Site.Master , jeśli nie jest jeszcze otwarta.
Zaktualizuj kontrolkę ListView o nazwie "
categoryList" z wyróżnionymi zmianami na żółto, aby znaczniki wyglądały następująco:<asp:ListView ID="categoryList" ItemType="WingtipToys.Models.Category" runat="server" SelectMethod="GetCategories" > <ItemTemplate> <b style="font-size: large; font-style: normal"> <a href="<%#: GetRouteUrl("ProductsByCategoryRoute", new {categoryName = Item.CategoryName}) %>"> <%#: Item.CategoryName %> </a> </b> </ItemTemplate> <ItemSeparatorTemplate> | </ItemSeparatorTemplate> </asp:ListView>W Eksploratorze rozwiązań otwórz stronę ProductList.aspx .
ItemTemplateZaktualizuj element strony ProductList.aspx za pomocą aktualizacji wyróżnionych na żółto, więc znaczniki są wyświetlane w następujący sposób:<ItemTemplate> <td runat="server"> <table> <tr> <td> <a href="<%#: GetRouteUrl("ProductByNameRoute", new {productName = Item.ProductName}) %>"> <image src='/Catalog/Images/Thumbs/<%#:Item.ImagePath%>' width="100" height="75" border="1" /> </a> </td> </tr> <tr> <td> <a href="<%#: GetRouteUrl("ProductByNameRoute", new {productName = Item.ProductName}) %>"> <%#:Item.ProductName%> </a> <br /> <span> <b>Price: </b><%#:String.Format("{0:c}", Item.UnitPrice)%> </span> <br /> <a href="/AddToCart.aspx?productID=<%#:Item.ProductID %>"> <span class="ProductListItem"> <b>Add To Cart<b> </span> </a> </td> </tr> <tr> <td> </td> </tr> </table> </p> </td> </ItemTemplate>Otwórz kod zaplecza ProductList.aspx.cs i dodaj następującą przestrzeń nazw zaznaczoną na żółto:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using WingtipToys.Models; using System.Web.ModelBinding; using System.Web.Routing;Zastąp metodę
GetProductsw pliku code-behind (ProductList.aspx.cs) następującym kodem:public IQueryable<Product> GetProducts( [QueryString("id")] int? categoryId, [RouteData] string categoryName) { var _db = new WingtipToys.Models.ProductContext(); IQueryable<Product> query = _db.Products; if (categoryId.HasValue && categoryId > 0) { query = query.Where(p => p.CategoryID == categoryId); } if (!String.IsNullOrEmpty(categoryName)) { query = query.Where(p => String.Compare(p.Category.CategoryName, categoryName) == 0); } return query; }
Dodaj kod do szczegółów produktu
Teraz zaktualizuj kod (ProductDetails.aspx.cs) dla strony ProductDetails.aspx , aby używać danych trasy. Zwróć uwagę, że nowa metoda GetProduct akceptuje również wartość ciągu zapytania w sytuacji, gdy użytkownik posiada zakładkę z linkiem, który używa starszego, nieprzyjaznego dla użytkownika, nieprzekierowanego adresu URL.
Zastąp metodę
GetProductw części kodowej pliku (ProductDetails.aspx.cs) następującym kodem:public IQueryable<Product> GetProduct( [QueryString("ProductID")] int? productId, [RouteData] string productName) { var _db = new WingtipToys.Models.ProductContext(); IQueryable<Product> query = _db.Products; if (productId.HasValue && productId > 0) { query = query.Where(p => p.ProductID == productId); } else if (!String.IsNullOrEmpty(productName)) { query = query.Where(p => String.Compare(p.ProductName, productName) == 0); } else { query = null; } return query; }
Uruchamianie aplikacji
Teraz możesz uruchomić aplikację, aby wyświetlić zaktualizowane trasy.
- Naciśnij klawisz F5 , aby uruchomić przykładową aplikację Wingtip Toys.
Zostanie otwarta przeglądarka i zostanie wyświetlona strona Default.aspx . - Kliknij link Produkty w górnej części strony.
Wszystkie produkty są wyświetlane na stronie ProductList.aspx . Dla przeglądarki zostanie wyświetlony następujący adres URL (przy użyciu numeru portu):
https://localhost:44300/ProductList - Następnie kliknij link Kategoria samochody w górnej części strony.
Na stronie ProductList.aspx są wyświetlane tylko samochody. Dla przeglądarki zostanie wyświetlony następujący adres URL (przy użyciu numeru portu):
https://localhost:44300/Category/Cars - Kliknij link zawierający nazwę pierwszego samochodu wymienionego na stronie ("Samochód kabrioletowy"), aby wyświetlić szczegóły produktu.
Dla przeglądarki zostanie wyświetlony następujący adres URL (przy użyciu numeru portu):
https://localhost:44300/Product/Convertible%20Car - Następnie wpisz następujący nieroutowany adres URL (przy użyciu numeru portu) w przeglądarce:
https://localhost:44300/ProductDetails.aspx?productID=2
Kod nadal rozpoznaje adres URL zawierający ciąg zapytania, w przypadku gdy użytkownik ma dany link dodany do zakładek.
Podsumowanie
W tym samouczku dodano trasy dla kategorii i produktów. Wiesz już, jak można zintegrować trasy z kontrolkami danych korzystającymi z powiązania modelu. W następnym samouczku zaimplementujesz globalną obsługę błędów.
Dodatkowe zasoby
przyjazne adresy URL ASP.NET
Wdrażanie aplikacji Secure ASP.NET Web Forms przy użyciu członkostwa, protokołu OAuth i usługi SQL Database w usłudze Azure App Service
Microsoft Azure — bezpłatna wersja próbna