Как вы используете помощники тегов для создания ссылок на контроллеры / действия, которые используют косые черты в атрибутах маршрута? - PullRequest
0 голосов
/ 22 мая 2018

Прежде чем я начну, я знаю, что есть похожие вопросы, но все они касаются использования слешей с параметрами в маршрутах, чего я не пытаюсь достичь (по крайней мере, пока).

Я создаю веб-приложение ASP.NET Core 2 MVC и у меня возникают проблемы с косыми чертами в маршрутах, которые экранируются при создании ссылок на мои действия.У меня есть следующий контроллер:

[Route("Manage/Account")]
public class AccountsController : Controller
{
    [Route("[Action]")]
    public IActionResult Index() => View();

    [Route("[Action]")]
    public IActionResult Other() => View();
}

И следующие ссылки в представлении:

<a asp-controller="Manage/Accounts" asp-action="Index">Accounts</a>
<a asp-controller="Manage/Account" asp-action="Other">Accounts (Other)</a>

Это генерирует следующий HTML:

<a href="/Manage%5CAccount">Accounts</a>
<a href="/Manage%5CAccount/Other">Accounts (Other)</a>

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

Может кто-нибудь предложить способ не дать ему избежать моих слешей?

Редактировать: Подробнее

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

Я пытаюсь реализовать настройку папок функций, которую я успешно использовал с ASP.NET MVC5, которая использует маршрутизацию атрибутов и механизм пользовательского представления, чтобы разрешить вложенные функции.Для этой работы я использовал [RoutePrefix(...)].Контроллер, приведенный ниже, будет находиться в следующем каталоге ~/Features/Manage/Accounts:

[RoutePrefix("Manage/Accounts")]
public class Accounts : Controller
{
    [Route("Index")]
    public ActionResult Index() => View();

    [Route("Other")]
    public ActionResult Other() => View();
}

Затем ссылки добавляются в представлениях, подобных этому:

@Html.ActionLink("Accounts", "Index", "Manage/Accounts")
@Html.ActionLink("Accounts (Other)", "Other", "Manage/Accounts")

, который затем отображается как:

<a href="/Manage/Accounts">Accounts</a>
<a href="/Manage/Accounts/Other">Accounts (Other)</a>

К сожалению, атрибут [RoutePrefix(...)] недоступен в ASP.NET Core MVC, и может показаться, что использование стандартного атрибута [Route(...)] не может эмулировать поведение, обнаруженное в MVC5.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

То, что сказал @Кирк, совершенно верно.Я просто хочу дать вам представление о Area в MVC, потому что, глядя на ссылки в вашем примере, похоже, что вы хотите, чтобы эти ссылки начинались с /manage.

.поделился, как настроить зоны в MVC.Вы можете посмотреть здесь .

0 голосов
/ 22 мая 2018

Похоже, вы путаете контроллеры и маршруты.При использовании asp-controller вы должны указать имя класса контроллера (без суффикса Controller).В вашем случае вам нужно:

<a asp-controller="Accounts" asp-action="Index">Accounts</a>
<a asp-controller="Accounts" asp-action="Other">Accounts (Other)</a>

Используя вышеизложенное, вы должны в итоге получить ожидаемые маршруты:

<a href="/Manage/Account">Accounts</a>
<a href="/Manage/Account/Other">Accounts (Other)</a>

Помимо этого, вы можете упростить свои атрибуты, например, так:

[Route("Manage/Account/[action]")]
public class AccountsController : Controller
{
    public IActionResult Index() => View();

    public IActionResult Other() => View();
}

Токен [action] можно применять на уровне контроллера, как показано на рисунке, избегая необходимости добавлять его к каждому методу.

...