Использование областей с RedirectToAction приводит к бесконечному циклу перенаправлений - PullRequest
0 голосов
/ 13 июня 2019

В моем проекте ASP.NET Core MVC 2.2 я использую области для упрощения структуры классов, представлений и т. Д. Однако при перенаправлении с одного контроллера на другой через RedirectToAction я сталкиваюсь со следующей проблемой.

У меня есть область под названием «Панель инструментов», контроллер под названием DefaultDashboardController и HomeController.DefaultDashboardController является частью области Dashboard.HomeController не имеет назначенной области.

В DefaultDashboardController есть метод индекса, который возвращает только представление.

Теперь я пытаюсь перенаправить из метода индексаиз Home Controller для метода Index DefaultDashboardController.

Мой HomeCntroller выглядит следующим образом:

public class HomeController 
{
    [HttpGet]
    public IActionResult Index()
    {
        return RedirectToAction("Index", "DefaultDashboard", new { Area = "Dashboard"});
    }
 }

Мой DefaultDashboardController выглядит следующим образом:

[Area("Dashboard")]
public class DefaultDashboardController 
{
    [HttpGet]
    public IActionResult Index()
    {
        return View();
    }
 }

Моя маршрутизацияКонфигурация настраивается следующим образом в классе запуска:

app.UseMvc(routes =>
    {
        routes.MapAreaRoute(
          name: "AreaDashboard",
          areaName: "Dashboard",
          template: "{area:exists}/{controller=DefaultDashboard}/{action=Index}/{id?}"
        );


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

Теперь, когда я вызываю метод индекса HomeController, меня всегда снова перенаправляют на тот же метод (Home / Index) (вызывая бесконечный циклзапросов на получение / перенаправление).

Единственный способ решить эту проблему - добавить параметр id к вызову RedirectToAction:

return RedirectToAction("Index", "DefaultDashboard", new { Area = "Dashboard", id=1});

Однако для меня это очень уродливый, громоздкий обходной путь.

Действительно ли RedirectToAction должен работать только таким образом?Или есть какой-то фундаментальный вопрос о том, как я хочу использовать функцию Area в MVC Core?

Обновление:

Хотя я все еще не уверен на 100%, почему мойПервоначальный маршрут вызывает короткое замыкание, и я обнаружил следующее решение, которое работает:

app.UseMvc(routes =>
    {
        routes.MapAreaRoute(
          name: "AreaDashboard",
          areaName: "Dashboard",
          template: "Dashboard/{controller=DefaultDashboard}/{action=Index}/{id?}"
        );


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

Как видите, я добавил путь "Dashboard" непосредственно в шаблон MapAreaRoute.Я предполагаю, что {область: существует} - и маршрут по умолчанию были оценены ядром MVC и рассмотрены как совпадающие маршруты.Затем система каким-то образом выбрала маршрут по умолчанию в качестве целевого маршрута.С моим фиксированным шаблоном "Dashboard" это уже не так.

1 Ответ

0 голосов
/ 13 июня 2019

Проблема в вашем маршруте по умолчанию. Маршрут области должен быть вашим маршрутом по умолчанию. У него уже есть ограничение :exists для этого параметра маршрута, поэтому оно будет работать и для не-зонных маршрутов. Инфраструктура маршрутизации закорачивается, поэтому предпочтительным будет маршрут по умолчанию без области.

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