Использование ASP.NET Friendly URLs

150

В Microsoft разработали пакет NuGet, который применяет средство маршрутизации URL для поддержки дружественных URL. Также в Microsoft разработали простую оболочку для использования средств маршрутизации в виде библиотеки ASP.NET Friendly URLs. Для использования пакета Microsoft ASP.NET Friendly URLs не обязательно понимать возможности, на которых он основан. Эта библиотека предлагает ряд удобных средств, которые не обеспечивал модуль, построенный в предыдущей статье.

Отключение обработчиков и модулей из предыдущих примеров

Перед началом работы с указанной библиотекой от Microsoft необходимо отключить обработчики и модули, которые были добавлены в проект ранее. В примере ниже показано, как закомментировать разделы файла Web.config, чтобы запросы не перехватывались предшествующими примерами:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" />
  </system.web>
  <system.webServer>
    <!--<handlers>
      <add name="ExtensionLess" path="*." verb="*"
           type="PathsAndURLs.ExtensionlessHandler"/>
    </handlers>
    <modules>
      <add name="Rewriter" type="PathsAndURLs.PathModule"/>
      <add name="Simple" type="PathsAndURLs.SimpleModule"/>
    </modules>-->
    <defaultDocument enabled="true">
      <files>
        <clear />
        <add value="Content/RequestReporter.aspx"/>
      </files>
    </defaultDocument>
  </system.webServer>
</configuration>

Мы оставили включенной конфигурацию стандартного документа, поскольку она не влияет на запросы, которые среда ASP.NET способна обработать.

Установка и конфигурирование пакета через NuGet

Выберите пункт Manage NuGet Packages (Управлять пакетами NuGet) в меню Project (Проект) среды Visual Studio, чтобы открыть окно Manage NuGet Packages. Выберите категорию Online в левой панели и введите friendly в поле поиска, расположенное в правом верхнем углу окна. Найдите в списке пакет Microsoft ASP.NET Friendly URLs. Щелкните на кнопке Install (Установить), чтобы загрузить и установить библиотечный пакет и его зависимости.

Установка пакета NuGet ASP.NET Friendly URLs

Для настройки библиотеки FriendlyUrls понадобится добавить в проект глобальный класс приложения и с помощью метода ApplicationStart() в файле Global.asax.cs инициализировать конфигурацию маршрутизации, как показано в примере ниже. Это напоминает прием, который применялся в при построении приложения GameStore:

using System;
using System.Web.Routing;
using Microsoft.AspNet.FriendlyUrls;

namespace PathsAndURLs
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.EnableFriendlyUrls();
        }
    }
}

Пространство имен System.Web.Routing содержит классы, поддерживающие средства маршрутизации URL, на основе которого построена библиотека FriendlyUrls. Мы импортируем с помощью using пространство имен Microsoft.AspNet.FriendlyUrls, поэтому можем вызвать расширяющий метод EnableFriendlyUrls() на статическом свойстве RouteTable.Routes. Результатом является включение функции маршрутизации дружественных URL.

Использование средств библиотеки FriendlyUrls

Базовое средство библиотеки FriendlyUrls заключается в поддержке запросов, в которых не указаны файловые расширения. Как и в нашей специальной реализации, это означает, что запрос /Default будет отображен на /Default.aspx, а запрос /Content/RequestReporter - на /Content/RequestReporter.aspx. Существует также пара других удобных средств, которые рассматриваются в последующих разделах.

Использование расширяющих методов

Библиотека FriendlyUrls содержит несколько расширяющих методов, которые применяются к объекту HttpRequest и упрощают работу с дружественными URL. Эти методы кратко описаны в таблице ниже:

Расширяющие методы, определенные в библиотеке FriendlyUrls
Метод Описание
GetFriendlyUrlFileExtension()

Возвращает расширение файла, на который был отображен запрос; например, для запроса /Default этот метод дает результат .aspx

GetFriendlyUrlFileVirtualPath()

Возвращает виртуальный путь, на который запрос был отображен, выраженный относительно корня приложения; например, для запроса /Default этот метод дает результат ~/Default.aspx

GetFriendlyUrlSegments()

Возвращает коллекцию IList<string>, содержащую сегменты информации пути для запроса

Одно из применений дружественных URL связано с включением в запрос дополнительных сведений посредством добавочной информации пути, так чтобы запрос для виртуального пути /Colors/Red/Blue, например, мог быть направлен веб-форме /Colors.aspx. Информация пути /Red/Blue могла бы использоваться для настройки генерируемого ответа.

Расширяющий метод GetFriendlyUrlSegments() позволяет легко обращаться к отдельным сегментам, содержащимся в информации пути. Для демонстрации этой возможности мы создали новую веб-форму по имени Colors.aspx, контент которой показан в примере ниже:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Colors.aspx.cs" 
    Inherits="PathsAndURLs.Colors" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title></title>
</head>
<body>
    Доступные цвета:
    <ol>
        <asp:Repeater ID="Repeater1" ItemType="System.String" 
            SelectMethod="GetColors" runat="server">
            <ItemTemplate>
                <li><%# Item %></li>                    
            </ItemTemplate>
        </asp:Repeater>
    </ol>
</body>
</html>

В этой веб-форме с помощью элемента управления Repeater генерируется последовательность элементов <li> для заполнения элемента <ol>. Значения элементов списка получаются из метода GetColors(), который определен в файле отделенного кода Colors.aspx.cs:

using Microsoft.AspNet.FriendlyUrls;
using System.Collections.Generic;

namespace PathsAndURLs
{
    public partial class Colors : System.Web.UI.Page
    {
        public IEnumerable<string> GetColors()
        {
            return Request.GetFriendlyUrlSegments();
        }
    }
}

Метод GetColors() определен так, что он возвращает результат вызова расширяющего метода GetFriendlyUrlSegments(). В итоге генерируется элемент списка для каждого сегмента информации пути в виртуальном пути.

Для использования расширяющих методов потребуется импортировать пространство имен, содержащее класс, в котором они определены - в рассматриваемом примере это пространство имен Microsoft.AspNet.FriendlyUrls.

Чтобы получить результат, запустите приложение и запросите URL вида /Colors/Красный/Желтый/Зеленый. Запрос будет направлен веб-форме Colors.aspx, которая создаст элементы списка Красный, Желтый и Зеленый:

Отображение сегментов информации пути

Комбинирование информации пути с URL без расширений и дружественными URL может привести к странному поведению, если информация пути и файловая структура похожи друг на друга. Например, если ввести запрос /Colors/Red/Green/Blue, то он интерпретируется как обращение к веб-форме /Colors/Colors.aspx с информацией пути /Red/Green/Blue. Однако если добавить в проект папку по имени Colors и поместить в нее веб-форму под названием Red.aspx, то указанный запрос мог бы интерпретироваться двумя способами. Хотя подобная ситуация редко возникает в реальных проектах, ее может быть трудно отследить, т.к. она вызывает проблемы только для определенных комбинаций сегментов URL.

Применение привязки модели к сегментам информации пути

Одним из лучших новых средств, появившихся в ASP.NET 4.5, безусловно, является привязка моделей. Мы не собираемся здесь вдаваться в особые детали, а лишь отметим, что библиотека FriendlyUrl обладает поддержкой средства привязки моделей, которую мы продемонстрируем в отношении путей.

Если запрос содержит единственный сегмент информации пути, то библиотека FriendlyUrls позволит использовать привязку модели, чтобы установить значение параметра для метода класса отделенного кода, который предоставляет данные элементу управления. В целях демонстрации мы создали файл веб-формы по имени Count.aspx с содержимым, показанным в примере ниже:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Count.aspx.cs" 
    Inherits="PathsAndURLs.Count" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title></title>
</head>
<body>
    Доступные числа:
    <ul>
        <asp:Repeater ID="Repeater1" ItemType="System.Int32" 
            SelectMethod="GetNumbers" runat="server">
            <ItemTemplate>
                <li><%# Item %></li>                    
            </ItemTemplate>
        </asp:Repeater>
    </ul> 
</body>
</html>

Эта веб-форма похожа на предыдущую за исключением того, что мы собираемся отображать последовательность значений int, получаемых из метода GetNumbers() класса отделенного кода. Определение метода GetNumbers() приведено в примере ниже, в котором представлено содержимое файла отделенного кода Count.aspx.cs:

using System.Collections.Generic;
using Microsoft.AspNet.FriendlyUrls;
using Microsoft.AspNet.FriendlyUrls.ModelBinding;

namespace PathsAndURLs
{
    public partial class Count : System.Web.UI.Page
    {
        public IEnumerable<int> GetNumbers([FriendlyUrlSegments(0)] int? max)
        {
            for (int i = 0; i < (max ?? 5); i++)
            {
                yield return i;
            }
        }
    }
}

Легко заметить, что к параметру max метода GetNumbers() применен атрибут FriendlyUrlSegments (который определен в пространстве имен Microsoft.AspNet.FriendlyUrls.ModelBinding). Когда элемент управления Repeater внутри веб-формы вызывает метод GetNumbers(), библиотека FriendlyUrls получит значение информации пути, преобразует его к типу параметра и предоставит это значение параметру max. Чтобы посмотреть, как все работает, запустите приложение и перейдите на URL вида /Count/3.

Элемент управления Repeater вызовет метод GetNumbers(), который заставит библиотеку FriendlyUrls преобразовать информацию пути (/3) в значение типа int, допускающего null, и присвоить его параметру max. В результате генерируется список из трех целочисленных значений:

Применение привязки модели к значениям из информации пути

Это замечательное средство, но есть пара моментов, которые следует знать, прежде чем применять его. Во-первых, мы должны указать индекс сегмента, из которого будет создано значение; по этой причине атрибуту был передан 0 в качестве аргумента.

Во-вторых, параметр, к которому применяется атрибут, должен иметь тип, допускающий null, чтобы значение могло быть установлено в null, если информация пути отсутствует или не может быть разобрана либо приведена к корректному типу. В примере использовался тип int, допускающий null (выраженный как int?), и в C# доступны версии, допускающие null, для всех элементарных типов. (Необходимость в типах, допускающих null, и применение значений null, когда данные не могут быть разобраны, является общим для всей привязки данных.)

Использование привязки модели в отношении сегментов информации пути - не идеальное решение, однако оно может оказаться удобным для простых схем URL. Чтобы построить более сложные и гибкие подходы, применяйте средство маршрутизации URL напрямую.

Пройди тесты
Лучший чат для C# программистов