Учебный курс по ASP.NET MVC 3, глава 5. Маршрутизация ASP.NET

Это продолжение курса по разработки веб-приложений на базе фреймворка ASP.NET MVC 3, начало курса вы можете прочитать в статьях:

В этом уроке вам будет представлено описание важной функциональности каждого приложения ASP.NET MVC – маршрутизации ASP.NET. Данный модуль отвечает за маршрутизацию входящих запросов на методы контроллеров MVC. В конце урока вы узнаете, как стандартная таблица маршрутизации связывается запросы с методами контроллеров.

Использование стандартной таблицы маршрутизации

По умолчанию создаваемое приложение ASP.NET MVC сконфигурировано на использование маршрутизации. Маршрутизация настраивается в двух местах.

Сперва маршрутизация включается в конфигурационном файле Web.config. В нем есть четыре секции, относящиеся к маршрутизации: system.web.httpModules, system.web.httpHandlers,system.webserver.modules,system.webserver.handlers. Не удаляйте эти секции, иначе маршрутизации не будет работать.

Также таблица маршрутизации создается в файле Global.asax. Этот файл содержит обработку событий в жизненном цикле приложения, и таблица маршрутизации создается во время события Application Start. Листинг 1 содержит код стандартного файла Global.asax для приложения ASP.NET MVC.

Листинг 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);
        }
    }
}

По умолчанию таблица маршрутизации содержит один маршрут Default, связывающий первый сегмент URL с именем контроллера, второй с методом, и третий с параметром id. Например URL

/Home/Index/3

Будет связан с:

контроллер = Home

метод = Index

id = 3

И будет вызван метод

HomeController.Index(3)

Ввод пустого URL приведет к вызову метода Index контроллера по умолчанию HomeController, код которого приведен в листинге 2.

Листинг 2 - HomeController.cs

 using System.Web.Mvc;

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

Метод Index() принимает один параметр Id, URL /Home приводит к вызову этого метода с пустым значением параметра Id. URL /Home также приведет к вызову этого метода, но уже без параметров, код которого приведен в листинге 3.

листинг 3 - HomeController. cs (метод Index без параметров)

 using System.Web.Mvc;


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

Метод Index не содержит на входе никаких параметров, и URL /Home вызовет именно этот метод. URL /Home/Index/3 также вызовет этот метод (id игнорируется). URL /Home также подходит к методу Index(), код которого приведен в листинге 4.

Листинг 4 - HomeController. cs (Метод Index с параметрами nullable)

 using System.Web.Mvc;

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

Метод Index() принимает один параметр Integer и, поскольку он является nullable (может иметь значение Null), метод Index() может быть вызван без дальнейших ошибок. Наконец, вызов Index() из листинга 5 с URL /Home вызовет исключение, так как параметр id – не nullable. Если вы попробуете вызвать метод, вы получите ошибку (рисунок 1)..

Листинг 5 - HomeController. cs (Метод Index с параметром Id)

 using System.Web.Mvc;

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

image

Рис. 1. Вызов метода, подразумевающего наличие параметра

URL /Home/Index/3, с другой стороны, отработает нормально с методом, код которого приведен в листинге 5. Запрос /Home/Index/3 вызовет метод Index() с параметром Id, значение которого будет равно 3.

Резюме

Цель этого урока – предоставить краткую информацию о маршрутизации ASP.NET. Мы рассмотрели стандартную таблицу маршрутизации приложения ASP.NET MVC и изучили, как стандартная таблица маршрутизации связывает URL-ы и методы контроллеров.

Благодарности

Благодарим Александра Белоцерковского за неоценимую помощь в подготовке данного курса.