Поделиться через


Создание пользовательских маршрутов (C#)

от Майкрософт

Узнайте, как добавить пользовательские маршруты в приложение ASP.NET MVC. В этом руководстве описано, как изменить таблицу маршрутов по умолчанию в файле Global.asax.

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

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

Представьте, например, что вы создаете приложение блога. Вы можете обрабатывать входящие запросы, которые выглядят следующим образом:

/Archive/12-25-2009

Когда пользователь вводит этот запрос, вы хотите вернуть запись в блоге, соответствующую дате 25.012.2009. Чтобы обработать запрос этого типа, необходимо создать пользовательский маршрут.

Файл Global.asax в листинге 1 содержит новый пользовательский маршрут с именем Blog, который обрабатывает запросы, которые выглядят как /Archive/entry date.

Листинг 1. Global.asax (с пользовательским маршрутом)

using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Blog",                                           // Route name
                "Archive/{entryDate}",                            // URL with parameters
                new { controller = "Archive", action = "Entry" }  // Parameter defaults
            );
            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);
        }
    }
}

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

Пользовательский маршрут блога соответствует любому запросу, который начинается с /Archive/. Таким образом, он соответствует всем следующим URL-адресам:

  • /Archive/12-25-2009

  • /Archive/10-6-2004

  • /Archive/apple

Пользовательский маршрут сопоставляет входящий запрос с контроллером с именем Archive и вызывает действие Entry(). При вызове метода Entry() дата входа передается в качестве параметра с именем entryDate.

Вы можете использовать пользовательский маршрут блога с контроллером в листинге 2.

Листинг 2. ArchiveController.cs

using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class ArchiveController : Controller
    {
        public string Entry(DateTime entryDate)
        {
            return "You requested the entry from " + entryDate.ToString();
        }
    }
}

Обратите внимание, что метод Entry() в листинге 2 принимает параметр типа DateTime. Платформа MVC достаточно умна для автоматического преобразования даты входа из URL-адреса в значение DateTime. Если параметр даты входа из URL-адреса не может быть преобразован в DateTime, возникает ошибка (см. рис. 1).

Рис. 1. Ошибка при преобразовании параметра

Диалоговое окно New Project (Новый проект)

Рис. 01. Ошибка при преобразовании параметра (щелкните для просмотра полноразмерного изображения)

Итоги

Цель этого руководства состояла в том, чтобы продемонстрировать, как можно создать пользовательский маршрут. Вы узнали, как добавить настраиваемый маршрут в таблицу маршрутов в файле Global.asax, который представляет записи блога. Мы рассмотрели, как сопоставить запросы записей блога с контроллером с именем ArchiveController и действием контроллера с именем Entry().