AmbiguousActionException в том же контроллере
Я пробовал Asp.NET Core, в частности, Areas. Прямо сейчас я сталкиваюсь с проблемой, где я получаю исключение, если я добавлю более одного представления в мой контроллер.
Это мое исключение:
Произошло необработанное исключение при обработке запроса.
AmbiguousActionException: несколько действий совпадают. Следующие действия соответствовали данным маршрута и были выполнены все ограничения:
Forum.Areas.Admin.Controllers.AdminController.Index (Форум) Forum.Areas.Admin.Controllers.AdminController.Testing (Форум)
Вот как я регистрирую маршрут:
app.UseMvc(routes =>
{
routes.MapRoute("adminRoute", "Admin/{controller}/{action}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
Мой контроллер:
namespace Forum.Areas.Admin.Controllers
{
[Area("Admin")]
[Route("admin")]
public class AdminController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Testing()
{
return Content("Testing area!");
}
}
}
Структура моего проекта:
Другие похожие вопросы, кажется, имеют неоднозначные действия над разными контроллерами, но в моем случае это два разных имени действий? Я неправильно зарегистрировал маршрут?
Редактировать: пожалуйста, никаких комментариев к моему отступу "2 пробела для вкладок" - это руководство по стилю с работы, я не могу сказать в нем:(
Заранее спасибо!
1 ответ
Прежде всего, вам не нужно Route
приписывать AdminController
потому что вы зарегистрировали маршруты в app.UseMvc()
- удалять [Route("admin")]
,
Кроме того, вы должны изменить свой маршрут в app.UseMvc()
,
Этот маршрут:
routes.MapRoute("adminRoute", "Admin/{controller}/{action}/{id?}");
следует изменить на:
routes.MapRoute("adminRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");
Вам нужно установить площадь в маршруте и значения по умолчанию для controller
а также action
(нет необходимости устанавливать значения по умолчанию, но это будет объяснено позже в ответе).
Итак, позвонить Index()
действие, которое вы должны напечатать это url
:
http://localhost:yourPortNumber/Admin
Здесь вы делаете запрос на Admin
площадь и значения по умолчанию используются (Admin
в качестве контроллера по умолчанию и Index
как действие по умолчанию). Вы можете изменить значения по умолчанию для этого маршрута.
ПРИМЕЧАНИЕ. Если вы не установили значения по умолчанию в вашем маршруте, тогда предыдущая ссылка не будет работать, вы должны написать полностью url
к действию - см. ниже.
Звонить Testing()
действие url
должно быть:
http://localhost:yourPortNumber/Admin/Admin/Testing
Здесь вы указываете название области (Admin
), имя контроллера (Admin
) и название действия (Testing
)
Точно так же вы можете позвонить Index()
действие и другие действия (если вам нужно больше):
http://localhost:yourPortNumber/Admin/Admin/Index
http://localhost:yourPortNumber/Admin/Admin/AntoherActionName
Итак, ваши маршруты должны быть настроены следующим образом:
app.UseMvc(routes =>
{
routes.MapRoute("adminRoute", "{area:exists}/{controller=Admin}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
и ваш контроллер:
[Area("Admin")]
public class AdminController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Testing()
{
return Content("Testing area!");
}
}
РЕДАКТИРОВАТЬ:
Вы также можете установить область по умолчанию в конфигурации маршрутов:
routes.MapRoute("adminRoute", "{area=Admin}/{controller=Admin}/{action=Index}/{id?}");
Теперь при запуске вашего приложения по умолчанию будет использоваться маршрут:
http://localhost:your_port_number/Admin/Admin/Index