Почему asp -route и asp -action исключают друг друга? - PullRequest
1 голос
/ 06 августа 2020

У меня есть следующие маршруты:

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

Почему это запрещено? Этот исходящий URL-адрес генерируется из HomeController и action method = Index

<a asp-route="out" asp-action="a" asp-route-id="someIdValue">This is an outoing URL.</a>

Представление, которое генерирует этот исходящий URL-адрес, взято из метода HomeController s Index.

Почему бы ему не использовать шаблон маршрута "out" и просто использовать "a" для действия, а Home в качестве контроллера для генерации /outbound/Home/a/someIdValue?

Я могу предоставить значение для id, почему я не могу указать значение для действия?

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете использовать asp-area вместо asp-route.

enter image description here

Startup.cs

    app.UseMvc(routes =>
        {
            routes.MapRoute(name: "out", template: "{area=Outbound}/{controller=Home}/{action=Index}");

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

Controller

[Area("Outbound")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

}



    Go на домашней странице Outoing по href = "/ outbound / home / index"  
Go на исходную домашнюю страницу по asp -area
@ Html .ActionLink («Go на выход на домашнюю страницу по @ Html .ActionLink», «Index» , "Home", new {area = "Outbound"})

Скриншоты теста

enter image description here

asp -route

Атрибут asp-route используется для создания ссылки URL непосредственно на именованный маршрут. Используя атрибуты маршрутизации, можно назвать маршрут, как показано в SpeakerController, и использовать в его действии Evaluations:

[Route("/Speaker/Evaluations", 
       Name = "speakerevals")]
public IActionResult Evaluations() => View();

В следующей разметке атрибут asp-route ссылается на именованный маршрут:

<a asp-route="speakerevals">Speaker Evaluations</a>

Вспомогательная функция тега привязки генерирует маршрут непосредственно к этому действию контроллера, используя URL-адрес /Speaker/Evaluations. Сгенерированный HTML:

<a href="/Speaker/Evaluations">Speaker Evaluations</a>

Если asp-controller или asp-action указано в дополнение к asp-route, сгенерированный маршрут может не соответствовать вашим ожиданиям.

Чтобы избежать конфликта маршрутов, asp-route не следует использовать с атрибутами asp-controller и asp-action .

BTW, default route и area route автоматически назначают значение порядка их конечным точкам в зависимости от порядка, в котором они вызываются.




Разница между asp-route и asp-controller & asp-action

Маршрут имена (asp-route) могут использоваться для генерации URL-адреса на основе указанного c маршрута.

В то же время {controller}/{action} также генерирует сопоставления URL-адресов с Home контроллером и Test действием .

    //works
    <a asp-controller="home" asp-action="test">asp-controller="home" asp-action="test"</a><br>

    //works
    <a asp-route="test">asp-route="test"</a><br>

    //InvalidOperationException
    <a asp-route="test" asp-controller="home" asp-action="test">asp-route="test" asp-controller="home" asp-action="test"</a>

InvalidOperationException возникает при установке обоих в одном теге <a>.

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...