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
Другие вопросы по тегам