Вспомогательные методы для URL

177

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

Мы продолжим пользоваться проектом HelperMethods, который создали ранее. Для целей этой и последующих статей создан новый контроллер по имени People, код которого приведен в примере ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using HelperMethods.Models;

namespace HelperMethods.Controllers
{
    public class PeopleController : Controller
    {
        private List<User> UserData = new List<User> {
            new User {FirstName = "Иван", LastName = "Иванов", Role = Role.Admin},
            new User {FirstName = "Петр", LastName = "Петров", Role = Role.User},
            new User {FirstName = "Сидор", LastName = "Сидоров", Role = Role.User},
            new User {FirstName = "Вася", LastName = "Васильев", Role = Role.Guest}
        };

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetPeople()
        {
            return View(UserData);
        }

        [HttpPost]
        public ActionResult GetPeople(string selectedRole)
        {
            if (selectedRole == "All" || selectedRole == null)
                return View(UserData);
            else
            {
                Role roleSelected = (Role)Enum.Parse(typeof(Role), selectedRole);
                return View(UserData.Where(user => user.Role == roleSelected));
            }
        }
    }
}

В этом контроллере определяется коллекция объектов модели User, которая будет применяться для демонстрации функциональных возможностей вспомогательных методов. Никакие новые приемы в этом контроллере не используются. Метод действия Index() возвращает стандартное представление. Мы будем применять два метода действий GetPeople() для обработки простой формы. Новые средства, рассматриваемые далее, проявляются в представлениях, которые будут созданы при демонстраций различных вспомогательных методов.

Также необходимо добавить в проект несколько новых стилей CSS, что и делается в файле Views/Shared/_Layout.cshtml. Элементы, к которым будут применены эти стили, определяются позже:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title</title>
    <style>
        /* ... */
        
        table, td, th {
            border: thin solid black;
            border-collapse: collapse;
            padding: 5px;
            background-color: lemonchiffon;
            text-align: left;
            margin: 10px 0;
        }

        div.load {
            color: red;
            margin: 10px 0;
            font-weight: bold;
        }

        div.ajaxLink {
            margin-top: 10px;
            margin-right: 5px;
            float: left;
        }
    </style>
</head>
<body>
    @RenderBody()
</body>
</html>

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

Метод Описание Пример Результат
Url.Content()

URL, относящиеся к приложению

Url.Content("~/Content/Site.css")
/Content/Site.css
Html.ActionLink()

Ссылка на именованное действие и контроллера

Html.ActionLink("Моя ссылка", "Index", "Home")
<a href="/Home/Index">Моя ссылка</a>
Url.Action()

URL для действия

Url.Action("GetPeople", "People")
/People/GetPeople
Url.RouteUrl()

URL, использующий данные маршрутизации

Url.RouteUrl( new {
    controller = "People", 
    action="GetPeople"
})
/People/GetPeople

Ссылка, использующая данные маршрутизации

Html.RouteLink("Моя ссылка", new {
    controller = "People", 
    action="GetPeople"
})
<a href="/People/GetPeople">Моя ссылка</a>

Ссылка на именованный маршрут

Html.RouteLink("Моя ссылка", "FormRoute", new {
    controller = "People", 
    action="GetPeople"
})
<a href="/app/form/People/GetPeople">Моя ссылка</a>

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

Чтобы продемонстрировать работу этих вспомогательных методов, в папку Views/People добавлен файл представления Index.cshtml, содержимое которого приведено в примере ниже:

@{
    ViewBag.Title = "Index";
    Layout = "/Views/Shared/_Layout.cshtml";
}
<h2>Базовые ссылки и URL'ы</h2>
<table>
    <thead><tr><th>Код</th><th>Генерирует</th></tr></thead>
    <tbody>
        <tr>
            <td>Url.Content("~/Content/Site.css")</td>
            <td>@Url.Content("~/Content/Site.css")</td>
        </tr>
        <tr>
            <td>Html.ActionLink("Моя ссылка", "Index", "Home")</td>
            <td>@Html.ActionLink("Моя ссылка", "Index", "Home")</td>
        </tr>
        <tr>
            <td>Url.Action("GetPeople", "People")</td>
            <td>@Url.Action("GetPeople", "People")</td>
        </tr>
        <tr>
            <td>Url.RouteUrl(new {controller = "People", action="GetPeople"})</td>
            <td>@Url.RouteUrl(new { controller = "People", action = "GetPeople" })</td>
        </tr>
        <tr>
            <td>
                Html.RouteLink("Моя ссылка", new {controller = "People",
                action="GetPeople"})
            </td>
            <td>
                @Html.RouteLink("Моя ссылка", new
                {
                    controller = "People",
                    action = "GetPeople"
                })
            </td>
        </tr>
        <tr>
            <td>
                Html.RouteLink("Моя ссылка", "FormRoute", new {controller = "People",
                action="GetPeople"})
            </td>
            <td>
                @Html.RouteLink("Моя ссылка", "FormRoute", new
                {
                    controller = "People",
                    action = "GetPeople"
                })
            </td>
        </tr>
    </tbody>
</table>

Это представление содержит тот же самый набор вызовов вспомогательных методов, что и перечисленный в таблице выше. Чтобы взглянуть на результат, запустите приложение и перейдите на URL вида /People/Index:

Использование вспомогательных методов для создания ссылок и URL
Пройди тесты
Лучший чат для C# программистов