Запретить добавление значений окружающего маршрута из URL-адреса в Html.Action и Html.ActionLinks автоматически в ASP.NET - PullRequest
0 голосов
/ 10 октября 2018

В моем проекте ASP.NET Core 2.1 я заметил, что мои Html.ActionLinks и Html.Actions, которые не имеют установленного id, автоматически включают id из текущего URL.

Например, учитывая следующее Html.ActionLink в представлении:

<li>@Html.ActionLink("Apply Online", "Apply-Online", "Careers")</li>

Если URL-адрес текущей страницы равен localhost:1234/careers/apply-online/53, то при проверке hrefвыше Html.ActionLink в моей навигации, он включает «53» в сгенерированном URL (даже если он не был установлен в моем представлении).

Я могу предотвратить это, если я явно установлю id ни к чему, как это:

<li>@Html.ActionLink("Apply Online", "Apply-Online", "Careers", new { id = "" })</li>

Однако есть ли способ остановить это по всем направлениям без необходимости обновлять все мои ссылки действий?

У меня странное поведение,где, если два контроллера имеют одинаковое имя действия (например, Index), а URL-адрес одного из них имеет id, он добавляет тот же id ко всем другим действиям с совпадающим именем на странице.

Вот мой маршрут в Startup.cs:

app.UseMvc(routes =>
{
    routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}");
});

ОБНОВЛЕНИЕ

Согласно документации , это выглядит как AmbientValues, который вызывает это поведение:

Второй параметр конструктора VirtualPathContext - это столбецлекция окружающих ценностей.Значения окружения обеспечивают удобство, ограничивая количество значений, которые разработчик должен указать в определенном контексте запроса.Текущие значения маршрута текущего запроса считаются окружающими значениями для генерации канала.В приложении ASP.NET Core MVC, если вы находитесь в действии «О» HomeController, вам не нужно указывать значение маршрута контроллера для связи с действием «Индекс» - используется окружающее значение Home.

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

Так что это, кажется, объясняетпочему, я могу предотвратить автоматическую установку id, если я явно установлю ее на { id = "" } в моем Html.ActionLink.

Мой вопрос, есть ли способ установить id, чтобы не использоватьзначения окружения по умолчанию, возможно, у меня MapRoute?И используйте id только если ему явно задано значение в Action или ActionLink?

1 Ответ

0 голосов
/ 11 октября 2018

Вы пробовали TagHelpers ?

TagHelpers заменяет HtmlHelpers, они более читабельны и просты в использовании.

Например, в HtmlHelpers ссылки были написаны так:

@Html.ActionLink("Apply Online", "Apply-Online", "Careers")

Он заменяется на ...

<a asp-area="" asp-controller="Careers" asp-action="Apply-Online"
asp-route-id="53" 
asp-route-toto="foo">
    Apply Online
</a>
<!-- expected: /Careers/Apply-Online/53?toto=foo -->

Очевидно, что при удалении asp-route-id удаляется «53» и при удалении asp-route-totoстрока запроса тоже удаляется.

...