ASP.NET Базовый маршрут контроллера и действие index - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь установить маршрут моего контроллера, а также иметь возможность перемещаться по индексу без ввода Index, вот что я пробовал:

Моя конфигурация маршрута

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

Попробуйте # 1

// My controller
[Route("panel/admin")]
public class MyController...

// My index action
public IActionResult Index()...

Проблема: это не работает, все действия становятся доступными на panel/admin, поэтому я получаю сообщение об ошибке Multiple actions matched.
Даже при установке маршрута моего действия индекса на Route("") ничего не изменится.

Попробуйте # 2

// My controller
[Route("panel/admin/[action]")]
public class MyController...

// My index action
[Route("")]
public IActionResult Index()...

Здесь индексный маршрут не меняется, он остается panel/admin/Index.

Что я хочу

Я хочу иметь доступ к своему действию index при переходе к panel/admin, а также хочу, чтобы другие мои действия работали только с именами их методов, такими как panel/admin/UsersList.

Полный контроллер

[Route("panel/admin/[action]")]
public class MyController
{

    [Route("")]
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult UsersList()
    {
        var users = _db.Users.ToList();
        return View(users);
    }

    // Other actions like UsersList

}

Спасибо.

1 Ответ

0 голосов
/ 02 июля 2018

Ссылка Маршрутизация к действиям контроллера в ASP.NET Core

При использовании атрибутов маршрутов вы должны быть очень точны в отношении желаемых маршрутов, чтобы избежать конфликтов маршрутов. Это также означает, что вам нужно будет указать все маршруты. В отличие от обычной маршрутизации.

Вариант № 1

[Route("panel/admin")]
public class MyController {

    [HttpGet]
    [Route("")] //GET panel/admin
    [Route("[action]")]  //GET panel/admin/index
    public IActionResult Index() {
        return View();
    }

    [HttpGet]
    [Route("[action]")] //GET panel/admin/UsersList
    public IActionResult UsersList() {
        var users = _db.Users.ToList();
        return View(users);
    }

    // Other actions like UsersList
}

Вариант № 2

[Route("panel/admin/[action]")]
public class MyController {

    [HttpGet] //GET panel/admin/index
    [Route("~/panel/admin")] //GET panel/admin        
    public IActionResult Index() {
        return View();
    }

    [HttpGet] //GET panel/admin/UsersList
    public IActionResult UsersList() {
        var users = _db.Users.ToList();
        return View(users);
    }

    // Other actions like UsersList
}

Тильда (~) в [Route("~/panel/admin")] переопределяет префикс маршрута на контроллере.

Совет

Хотя использование нескольких маршрутов в действиях может показаться мощным, лучше чтобы пространство URL вашего приложения было простым и четким. использование несколько маршрутов на действиях только там, где это необходимо существующие клиенты.

...