Для создания ссылок на странице Razor можно естественно применять стандартный html-элемент <a >
. Однако для
упрощения генерации ссылок ASP.NET Core также предоставляет такой tag-хелпер, как AnchorTagHelper. Он может принимать ряд специальных атрибутов:
asp-controller: указывает на контроллер, которому предназначен запрос
asp-action: указывает на действие контроллера
asp-area: указывает на действие область, в которой расположен контроллер или страница RazorPage (если они находятся в отдельной области)
asp-page: указывает на RazorPage, которая будет обрабатывать запрос
asp-page-handler: указывает на обработчик страницы RazorPage, которая будет применяться для обработки запроса
asp-host: указывает на домен сайта
asp-protocol: определяет протокол (http или https)
asp-route: указывает на название маршрута
asp-all-route-data: устанавливает набор значений для параметров
asp-route-[название параметра]: определяет значение для определенного параметра
asp-fragment: определяет ту часть хэш-ссылки, которая идет после символа решетки #. Например, "paragraph2" в ссылке "http://mysite.com/#paragraph2"
Рассмотрим некоторые из этих атрибутов. Допустим, в проекте есть две страницы - Index.cshtml и About.cshtml
Определим с помощью хелпера AnchorTagHelper на странице Index.cshtml ссылку на страницу About.cshtml:
@page @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @model RazorPagesApp.Pages.IndexModel <h2>Index Page</h2> <a asp-page="About">О сайте</a>
В данном случае используется не элемент html <a />
, а именно хелпер AnchorTagHelper. Его атрибут
asp-page указывает на название страницы
Атрибут asp-page-handler позволяет установить определенный обработчик страницы, на который будет идти запрос. Допустим, в файле About.cshtml.cs будет определен обработчик страницы:
using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPagesApp.Pages { public class AboutModel : PageModel { public string Header { get; private set; } = ""; public void OnGet() { Header = "О компании"; } public void OnGetSite() { Header = "О сайте"; } } }
В дополнение к методу OnGet здесь определен обработчик страницы - метод OnGetSite()
, то есть название обработчика - "Site". В каждом из методов изменяется значение
свйоства Header.
На самой странице About.cshtml просто выведем значение свойства Header:
@page @model RazorPagesApp.Pages.AboutModel <h2>@Model.Header</h2>
А на странице Index.cshtml определим пару ссылок:
@page @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @model RazorPagesApp.Pages.IndexModel <h2>Index Page</h2> <a asp-page="About">О компании</a> | <a asp-page="About" asp-page-handler="Site">О сайте</a>
Первая ссылка просто ведет на страницу About, а вторая - непосредственно на обработчик Site.
AnchorTagHelper по умолчанию создает локальную ссылку, если же нам надо создать ссылку на другой домен, то мы можем применить атрибут asp-host:
<a asp-page="About" asp-host="localhost.com" asp-protocol="https">О сайте</a>
Кроме того, мы можем изменить стандартный протокол на https, использовав атрибут asp-protocol. Данный элемент в итоге создает следующую ссылку: https://localhost.com/About
А что если страница Razor должна получать какие-нибудь параметры, которые надо указать в ссылке. Например, пусть страница About.cshtml получает параметр id:
@page "{id?}" @model RazorPagesApp.Pages.AboutModel <h2>About Person @Request.RouteValues["id"]</h2>
В этом случае для создания ссылки можем использовать атрибут asp-route-:
<a asp-page="About" asp-route-id="5">About Person 5</a>
Если страница Razor принимает несколько параметров маршрута, например:
@page "{id}/{name}/{age}" @model RazorPagesApp.Pages.AboutModel <p>Id: <b>@Request.RouteValues["id"]</b></p> <p>Name: <b>@Request.RouteValues["name"]</b></p> <p>Age: <b>@Request.RouteValues["age"]</b></p>
то мы можем указать несколько атрибутов asp-route-
:
<a asp-page="About" asp-route-id="5" asp-route-age="18" asp-route-name="Tom">Person 5</a>
В данном случае будет формироваться ссылка
https://localhost:7085/About/5/Tom/18
Чтобы не устанавливать все параметры по отдельности, можно применить атрибут asp-all-route-data:
<a asp-page="About" asp-all-route-data='new Dictionary<string,string> { { "id", "5" }, {"name", "tom" }, { "age", "18" } }' >Person 5</a>
asp-all-route-data
в качестве значения принимает словарь с параметрами и их значениями. В результате будет генерироваться
ссылка, аналогичная предыдущей.
Кроме создания ссылок в коде Razor, ASP.NET Core позволяет создавать ссылки в коде C#. Для этого применяется метод Url.Page(), которому передаются необходимые параметры. Он имеет ряд версий:
string? Url.Page (string? pageName, string? pageHandler, object? values, string? protocol, string? host, string? fragment); string? Url.Page (string? pageName, string? pageHandler, object? values, string? protocol, string? host); string? Url.Page (string? pageName, string? pageHandler, object? values, string? protocol); string? Url.Page (string? pageName, string? pageHandler, object? values); string? Url.Page (string? pageName, object? values); string? Url.Page (string? pageName, string? pageHandler); string? Url.Page (string? pageName);
По сути этот метод все те же параметры, которые передаются в tag-хелпер AnchorTagHelper. Например, возьмем выше определенную страницу About.cshtml, которая принимает три параметра, и создадим ссылку на эту страницу в коде Index.cshtml.cs:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace RazorPagesApp.Pages { public class IndexModel : PageModel { public IActionResult OnGetAbout() { string? url = Url.Page("About", new { id = 1, name = "Tom", age = 37 }); return Redirect(url ?? "About"); } } }
В данном случае в модели IndexModel определен обработчик страницы OnGetAbout
, в котором будет создаваться ссылка "https://localhost:7085/About/1/Tom/37". И затем
на эту ссылку будет идти переадресация. Стоит учитывать, что метод Url.Page может возвращать значение null. И в данном случае, если метод не смог сформировать ссылку, идет просто редирект
на страницу About.cshtml.