Omówienie routingu we wzorcu ASP.NET MVC (C#)

Autor: Stephen Walther

W tym samouczku Stephen Walther pokazuje, jak platforma ASP.NET MVC mapuje żądania przeglądarki na akcje kontrolera.

W tym samouczku przedstawiono ważną funkcję każdej aplikacji MVC ASP.NET o nazwie ASP.NET Routing. Moduł ASP.NET Routing jest odpowiedzialny za mapowanie żądań przychodzących na określone akcje kontrolera MVC. Na koniec tego samouczka dowiesz się, jak standardowa tabela tras mapuje żądania na akcje kontrolera.

Korzystanie z domyślnej tabeli tras

Podczas tworzenia nowej aplikacji ASP.NET MVC aplikacja jest już skonfigurowana do korzystania z routingu ASP.NET. ASP.NET Routing jest skonfigurowany w dwóch miejscach.

Najpierw ASP.NET Routing jest włączony w pliku konfiguracji sieci Web aplikacji (Web.config pliku). Istnieją cztery sekcje w pliku konfiguracji, które są istotne dla routingu: sekcja system.web.httpModules, sekcja system.web.httpHandlers, sekcja system.webserver.modules i sekcja system.webserver.handlers. Uważaj, aby nie usuwać tych sekcji, ponieważ bez tych sekcji routing nie będzie już działać.

Po drugie, i co ważniejsze, tabela tras jest tworzona w pliku Global.asax aplikacji. Plik Global.asax to plik specjalny zawierający programy obsługi zdarzeń dla zdarzeń ASP.NET zdarzeń cyklu życia aplikacji. Tabela tras jest tworzona podczas zdarzenia Uruchamianie aplikacji.

Plik w liście 1 zawiera domyślny plik Global.asax dla aplikacji ASP.NET MVC.

Lista 1 — Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Po pierwszym uruchomieniu aplikacji MVC wywoływana jest metoda Application_Start(). Ta metoda z kolei wywołuje metodę RegisterRoutes(). Metoda RegisterRoutes() tworzy tabelę tras.

Domyślna tabela tras zawiera jedną trasę (o nazwie Default). Trasa domyślna mapuje pierwszy segment adresu URL na nazwę kontrolera, drugi segment adresu URL na akcję kontrolera, a trzeci segment na parametr o nazwie id.

Załóżmy, że wprowadzasz następujący adres URL na pasku adresu przeglądarki internetowej:

/Home/Index/3

Trasa domyślna mapuje ten adres URL na następujące parametry:

  • controller = Strona główna

  • action = Index

  • id = 3

Po zażądaniu adresu URL /Home/Index/3 zostanie wykonany następujący kod:

HomeController.Index(3)

Trasa domyślna zawiera wartości domyślne dla wszystkich trzech parametrów. Jeśli nie podasz kontrolera, parametr kontrolera jest domyślnie ustawiony na wartość Strona główna. Jeśli nie podasz akcji, parametr akcji jest domyślnie ustawiony na wartość Indeks. Na koniec, jeśli nie podasz identyfikatora, parametr id domyślnie do pustego ciągu.

Przyjrzyjmy się kilku przykładom sposobu mapowania adresów URL tras domyślnych na akcje kontrolera. Załóżmy, że wprowadzasz następujący adres URL na pasku adresu przeglądarki:

/W: strona główna

Ze względu na domyślne wartości parametru trasy wprowadzanie tego adresu URL spowoduje wywołanie metody Index() klasy HomeController w liście 2.

Lista 2 — HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }
}

Na liście 2 klasa HomeController zawiera metodę o nazwie Index(), która akceptuje pojedynczy parametr o nazwie Id. Adres URL /Home powoduje wywołanie metody Index() z pustym ciągiem jako wartości parametru Id.

Ze względu na sposób wywoływania akcji kontrolera przez strukturę MVC adres URL /Home jest również zgodny z metodą Index() klasy HomeController w liście 3.

Lista 3 — HomeController.cs (akcja indeksu bez parametru)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Metoda Index() w liście List 3 nie akceptuje żadnych parametrów. Adres URL /Strona główna spowoduje wywołanie tej metody Index(). Adres URL /Home/Index/3 wywołuje również tę metodę (identyfikator jest ignorowany).

Adres URL /Home jest również zgodny z metodą Index() klasy HomeController w list 4.

Lista 4 — HomeController.cs (akcja indeksu z parametrem dopuszczalnym do wartości null)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            return View();
        }
    }
}

Na liście 4 metoda Index() ma jeden parametr liczba całkowita. Ponieważ parametr jest parametrem dopuszczalnym do wartości null (może mieć wartość Null), indeks() można wywołać bez zgłaszania błędu.

Na koniec wywołanie metody Index() w pozycji Listing 5 z adresem URL /Home powoduje wyjątek, ponieważ parametr Id nie jest parametrem dopuszczalnym do wartości null. Jeśli spróbujesz wywołać metodę Index(), zostanie wyświetlony błąd wyświetlany na rysunku 1.

Lista 5 — HomeController.cs (akcja indeksu z parametrem Id)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int id)
        {
            return View();
        }
    }
}

Wywoływanie akcji kontrolera, która oczekuje wartości parametru

Rysunek 01. Wywoływanie akcji kontrolera, która oczekuje wartości parametru (kliknij, aby wyświetlić obraz pełnowymiarowy)

Adres URL /Home/Index/3, z drugiej strony, działa dobrze w przypadku akcji kontrolera indeksu w liście 5. Żądanie /Home/Index/3 powoduje wywołanie metody Index() z parametrem Id, który ma wartość 3.

Podsumowanie

Celem tego samouczka było krótkie wprowadzenie do usługi ASP.NET Routing. Zbadaliśmy domyślną tabelę tras uzyskaną za pomocą nowej aplikacji ASP.NET MVC. Wiesz już, jak domyślna trasa mapuje adresy URL na akcje kontrolera.