C# Маршруты нестандартной карты / Просмотр путей / Генерация ссылок - PullRequest
0 голосов
/ 14 января 2020

Проблема / попытка 1:
У меня есть пользовательская карта маршрутов:

routes.MapRoute(
    name: "User Profile",
    url: "User/{userId}/{controller}/{action}/{id}",
    defaults: new { Areas = "User", controller = "Kpi", action = "Index", id = UrlParameter.Optional }
);

Если я вручную перехожу на URL /User/f339e768-fe92-4322-93ca-083c3d89328c/Kpi/View/1, страница загружается с ошибкой просмотра : The view 'View' or its master was not found or no view engine supports the searched locations.

Проблема / попытка 2:
Остановлен с использованием пользовательского маршрута и вместо него настроен мой контроллер:

    [RouteArea("User")]
    [RoutePrefix("{userId}/Kpi")]
    public class KpiController : BaseUserController
    {
        [Route("View/{id}")]
        public async Task<ActionResult> View(string userId, int? id = null)
        {
            [...]
        }
    }

Теперь это работает Я могу перейти к URL-адресу, и представление отображается нормально.

Проблема для обоих:
Хотя я могу перейти к обоим вручную, и они загружаются, я не могу создать URL правильно используя ActionLink:

@Html.ActionLink(kpi.GetFormattedId(), "View", "Kpi", new { Area = "User", userId = Model.Id, id = kpi.Id }, null)

Генерирует: /User/Kpi/View/1?userId=f339e768-fe92-4322-93ca-083c3d89328c вместо /User/f339e768-fe92-4322-93ca-083c3d89328c/Kpi/View/1

1 Ответ

0 голосов
/ 20 января 2020

URL-сопоставление
Через некоторое время я нашел решение для пользовательского сопоставления, которое я добавлял в основной RouteConfig.cs, а не в Area Регистрация. Перемещение MapRoute в Area работает правильно и без атрибутов RouteArea, RoutePrefix и Route в контроллере.

Регистрация области

public class UserAreaRegistration : AreaRegistration 
{
    public override string AreaName => "User";

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            name: "User",
            url: "User/{userId}/{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional }
        );

        context.MapRoute(
            "User_default",
            "User/{controller}/{action}/{id}",
            new {action = "Index", id = UrlParameter.Optional}
        );
    }
}

Ссылки
Вместо использования ActionLink я сейчас использую RouteLink.

@Html.RouteLink("KPIs", "User", new { Controller = "Kpi", Action = "Index", userId = Model.Id })
...