В моем проекте 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" это уже не так.