Параметры маршрута

Последнее обновление: 18.05.2022

Шаблон маршрута, который сопоставляется с конечной точкой, может иметь параметры. Параметры имеют имя и определяются в шаблоне маршрута внутри фигурных скобок: {название_параметра}

Например, определим конечную точку, которая принимает параметр:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Map("/users/{id}", Function(id As String) $"User Id: {id}")
        app.Map("/users", Function(context As HttpContext) "Users Page")
        app.Map("/", Function(context As HttpContext) "Index Page")

        app.Run()
    End Sub
End Module

Здесь определено три конечных точки, которые используются шаблоны маршрутов "/users/{id}", "/users" и "/". Причем шаблон маршрута для первой конечной точки принимает параметр с именем id:

"/users/{id}

Параметр id будет представлять содержимое последнего сегмента. Например, в пути запроса "/users/134" последний сегмент "134" как раз будет представлять параметр id. Если же параметр id не передается, а путь запроса - "/users", то такой запрос обрабатывается второй конечной точкой.

Если маршрут принимает параметр, то в делегате-обработчике маршрута мы можем получить значение этого параметра. Для этого мы можем просто определить действие, которое принимает соответствующий параметр:

Function(id As String) $"User Id: {id}"

То есть здесь через параметр id мы получаем одноименный параметр маршрута и далее можем его использовать при обработке запроса. Стоит отметить, что название параметра маршрута и название параметра лямбда-выражения совпадают.

Также стоит отметить, что здесь для параметра id указан тип - тип String, то есть здесь мы ожидаем получить через параметр маршрута некоторую строку.

Параметры маршрутов в ASP.NET Core и Visual Basic .NET

Определение нескольких параметров

Подобным образом можно определять и большее количество параметров маршрута:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Map("/users/{id}/{name}",
                Function(id As String, name As String) $"User Id: {id}   User Name: {name}")
        app.Map("/users", Function(context As HttpContext) "Users Page")
        app.Map("/", Function(context As HttpContext) "Index Page")

        app.Run()
    End Sub
End Module

В данном случае маршрут первой конечной точки принимает два параметра - id и name:

определение параметров маршрутов в ASP.NET Core и Visual Basic .NET

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

"/users/{id}{name}"

так как между параметрами id и name нет разделителя.

Обычно в качестве разделителя выступает слеш, который оформляет отдельный сегмент в пути запроса. Но это необязательно. В качестве разделителя могут применяться и другие символы. Например, установим в качестве разделителя дефис:

app.Map("/users/{id}-{name}",
    Function(id As String, name As String) $"User Id: {id}   User Name: {name}")
Разделитель параметров маршрута в ASP.NET Core и Visual Basic .NET

Более того это может быть набор символов:

app.Map(
    "/users/{id}and{name}", 
    Function(id As String, name As String) $"User Id: {id}   User Name: {name}")
);
Разделитель параметров в шаблоне маршрута в ASP.NET Core и Visual Basic .NET

Вынесение обработчика маршрута в отдельный метод

Если обработчик маршрута выносится в отдельный метод, то он также может определять параметры, который сопоставляются с параметрами маршрута по имени:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        Dim handler As HandleRequest = AddressOf UserHandler
        app.Map("/users/{id}/{name}", handler)

        app.Map("/users", Function(context As HttpContext) "Users Page")
        app.Map("/", Function(context As HttpContext) "Index Page")

        app.Run()
    End Sub

    Public Delegate Function HandleRequest(id As String, name As String) As String

    Function UserHandler(id As String, name As String) As String
        Return $"User Id: {id}   User Name: {name}"
    End Function
End Module

Для передачи метода с параметрами в качестве обработчика маршрута необходимо вначале определить делегат, которые соответствует этому методу:

Public Delegate Function HandleRequest(id As String, name As String) As String

То есть в данном случае предполагается, что метод будет принимать два параметра и возвращать строку.

Затем определяем переменную этого делегата, которая принимает ссылку на метод, и передаем эту переменную конечной точке:

Dim handler As HandleRequest = AddressOf UserHandler
app.Map("/users/{id}/{name}", handler)

Можно сократить код и сразу передать конечной точке объект делегата:

app.Map("/users/{id}/{name}", New HandleRequest(AddressOf UserHandler))

Необязательные параметры

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Map("/users/{id?}", Function(id As String)
                                    If String.IsNullOrEmpty(id) Then
                                        Return $"User Undefined"
                                    End If
                                    Return $"User Id: {id}"
                                End Function)
        app.Map("/", Function(context As HttpContext) "Index Page")

        app.Run()
    End Sub
End Module

Шаблон маршрута первой конечной точки состоит из двух сегментов, причем второй сегмент представляет параметр id, который помечен как необязательный. А это значит, что мы можем в запросе игнорировать значение для этого сегмента. Например, данный шаблон будет соответствовать двум следующим url:

/users/
/users/23
Необязательные параметры маршрута в ASP.NET Core и Visual Basic .NET

Необязательные параметры следует помещать в конце шаблона маршрута, как в случае с параметром id в примере выше. То есть, к примеру, шаблон "/users/{id?}/{name}" не будет работать корректно, если мы для параметра id не передадим значение. А вот шаблон "/users/{name}/{id?}" будет работать нормально.

Значения параметров по умолчанию

Параметрам маршрута также можно назначить значения по умолчанию на случай, если им не переданы значения:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()
        app.Map("{controller=Home}/{action=Index}/{id?}",
                Function(controller As String, action As String, id As String)
                    Return $"Controller: {controller}{Environment.NewLine}Action: {action}{Environment.NewLine}Id: {id}"
                End Function)

        app.Run()
    End Sub
End Module

Здесь определена одна конечная точка, которая использует следующий шаблон маршрута:

"{controller=Home}/{action=Index}/{id?}"

То есть шаблон состоит из трех параметров. Параметр "controller" имеет значение по умолчанию "Home". Параметр "action" имеет значение по умолчанию "Index". Параметр "id" определен как необязательный. В итоге при различных запросах у нас получатся следующие значения:

Запрос

Параметры запроса

https://localhost:7256/

controller=Home

action=Index

https://localhost:7256/Book

controller=Book

action=Index

https://localhost:7256/Book/Show

controller=Book

action=Show

https://localhost:7256/Book/Show/2

controller=Book

action=Show

id=2

Значения параметров по умолчанию в ASP.NET Core и Visual Basic .NET

Передача произвольного количества параметров в запросе

Мы можем обозначить любое количество сегментов в запросе, чтобы не быть жестко привязанным к числу сегментов с помощью параметра со знаком * ("звездочка") или ** (две звездочки) (это так называемый catchall-параметр):

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Map("users/{**info}",
                Function(info As String) $"User Info: {info}")

        app.Map("/", Function(context As HttpContext) "Index Page")
        app.Run()
    End Sub
End Module

Для первой конечной точки определяется шаблон маршрута, в котором параметр info будет представлять все, что идет после "/users". Это может быть в том числе пустая строка.

Произвольное количество параметров в маршруте в ASP.NET Core и Visual Basic .NET
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850