Помощники тегов перезаписываются ViewComponent

У меня есть приложение ASP.NET Core (fka ASP.NET 5, ASP.NET MVC 6). На странице макета есть следующие соответствующие ссылки:

<li><a asp-controller="order">Orders</a></li>
<li><a asp-controller="customer">Customers</a></li>
<li><a asp-controller="whatever">Something Else</a></li>

а затем (через ViewComponent)

<li><a asp-controller="account">Login</a></li>

Login.cshtml имеет следующее:

<form asp-controller="Account" asp-action="Login" method="post" role="form">
...
</form>

или <form action="/Account/Login">...</form> - без разницы.

Проблема в том, что как только я нажимаю «Войти» и попадаю на экран входа, все ссылки верхнего уровня («Заказы», ​​«Клиенты» и т. д.) превращаются в «/Account/Login»! Очевидно, если я поставлю старомодные href, они останутся без изменений. Но самая загадочная часть заключается в том, что если я укажу действие явно -

<li><a asp-controller="order" asp-action="Index">Orders</a></li>

Все работает корректно! Это ошибка, на которую я наткнулся, или это дизайн, который я не понимаю?


person Felix    schedule 28.02.2016    source источник
comment
Вы уверены, что все они превращаются в аккаунт/логин или превращаются в заказ/логин, клиент/логин и т. д.? Потому что, если вы не укажете действие, оно будет взято из окружающего маршрута. Взгляните на UrlHelper.Action (именно так помощник тега создает ссылку)   -  person Daniel J.G.    schedule 29.02.2016
comment
Звучит как ошибка для меня! Вы используете атрибутивную маршрутизацию? (Интересно, это происходит только с маршрутизацией атрибутов или также с обычными маршрутами)   -  person Daniel J.G.    schedule 01.03.2016
comment
нет, только обычная маршрутизация... Я попробую атрибутивную маршрутизацию и посмотрю, будет ли это иметь значение   -  person Felix    schedule 01.03.2016


Ответы (1)


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

<a asp-controller="SomeUnknownController">Link!</a>

Будет производить

<a href="">Link!</a>

Поскольку мы не знаем, что происходит в вашем действии Account/Login, мы не можем с уверенностью сказать, что это ошибка в привязке TagHelper. Но что-то где-то лажает с маршрутизацией.

person Leonardo Herrera    schedule 01.03.2016
comment
Конечно. Order, Customer и Whatever являются действительными контроллерами, которые разрешают действительные страницы до тех пор, пока я не нажму ссылку «Войти». Извините, если это было неясно в исходном вопросе. Спасибо. - person Felix; 02.03.2016
comment
Извините - пропустил ваш второй пункт. Действие HttpGet учетной записи/логина — не что иное, как return View(); - person Felix; 02.03.2016
comment
Да, конечно, но в вашем проекте могут быть и другие вещи, которые влияют на маршруты — аннотация Authorize, параметры в разделе конфигурации AddAuthentication или какой-то другой фильтр или промежуточное ПО, которое вы используете. Сначала вам нужно отказаться от этого, поэтому я бы рекомендовал создать новый проект и попытаться воспроизвести проблему. - person Leonardo Herrera; 02.03.2016