Создание ссылок

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

Для создания ссылок на странице 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

создание ссылок на странице Razor Pages in ASP.NET Core и C#

asp-page

Определим с помощью хелпера 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

Атрибут 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.

asp-host и asp-protocol

AnchorTagHelper по умолчанию создает локальную ссылку, если же нам надо создать ссылку на другой домен, то мы можем применить атрибут asp-host:

<a asp-page="About" asp-host="localhost.com" asp-protocol="https">О сайте</a>

Кроме того, мы можем изменить стандартный протокол на https, использовав атрибут asp-protocol. Данный элемент в итоге создает следующую ссылку: https://localhost.com/About

asp-route- и asp-all-route-data

А что если страница 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 в качестве значения принимает словарь с параметрами и их значениями. В результате будет генерироваться ссылка, аналогичная предыдущей.

Url.Page

Кроме создания ссылок в коде 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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850