Маршрутизация атрибутов MVC6 с двумя параметрами

Я искал это и ничего, что относится к тегу привязки тега MVC6 taghelper в связи с наличием альтернативного метода [HttpGet], который обслуживает несколько параметров.

Конечно, вы можете добавить несколько параметров к метке привязки MVC6, но как вы обрабатываете второй вариант с двумя параметрами, используя маршрутизацию attrubute ...

У меня есть два метода [HttpGet] IactionResult:

    //GET: UserAdmin
    public async Task<IActionResult> Index()
    {
        return View(await _userAdminService.GetAllUsers("name_desc", false));
    }


    // GET: UserAdmin/name_desc/True
    [HttpGet("Index/{sortValue}&{showDeactivated}")]
    public async Task<IActionResult> Index(string sortValue, bool showDeactivated)
    {
        return View(await _userAdminService.GetAllUsers(sortValue, showDeactivated));
    }

На мой взгляд, я пытаюсь перейти ко второму способу:

<a asp-action="Index" asp-route-sortValue="@Model.DisplayName" asp-route-showActivated="@Model.ShowDeActivated">Name: <span class="glyphicon glyphicon-chevron-down"></span></a>

который оказывает:

<a href="/UserAdmin?sortValue=name showActivated=True">Name: <span class="glyphicon glyphicon-chevron-down"></span></a>

or

    localhost.../UserAdmin?sorValue=name&showActivated=True

ОНО никогда не переходит ко второму методу.

Что мне нужно сделать, чтобы использовать второй метод [HttpGet] с двумя параметрами с помощью тега привязки MVC6?

РЕДАКТИРОВАТЬ

Также как вы обрабатываете амперсанд, разделяющий два параметра в атрибуте маршрута ...


person si2030    schedule 06.05.2016    source источник


Ответы (3)


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

Например, вы можете изменить свой шаблон маршрута на [HttpGet("UserAdmin/Index/{sortValue}/{showDeactivated}")]

Официальная документация ссылка

person Mike    schedule 06.05.2016
comment
Спасибо, что ответил, Майк. Я все еще борюсь с этим. Я поместил ваше предложение в качестве атрибута, и оно по-прежнему относится к первому методу индекса (как указано выше). Затем я, основываясь на статье Стивена Вальтера link использовал только [HttpGet ({sortValue} / {showDeactivated})] во втором методе, и хотя обе переменные имели значения, он по-прежнему перешел только к первому методу индекса, у которого нет параметров ... Какой шаблон маршрута будет принудить это ко второму методу? - person si2030; 06.05.2016
comment
@ si2030 как зовут ваш контроллер? - person Mike; 06.05.2016
comment
Мой контроллер называется UserAdminController. - person si2030; 06.05.2016
comment
Это тоже не сработало. Пробовал ваше обновленное решение .. пытался использовать [HttpGet (UserAdmin / Index / {sortValue} / {showDeactivated})], и я также пробовал [HttpGet (UserAdmin / {sortValue} / {showDeactivated})] Должен быть способ доступа второй индексный метод .. - person si2030; 06.05.2016
comment
Я посмотрел на вашу правку ... сделал это тоже ... должен быть способ сделать это, и я подозреваю, что это легко. - person si2030; 06.05.2016
comment
Проверил, и ваш работает. Впоследствии я тестировал свой и его помощник по привязке тегов, который создавал ссылку, с которой контроллер не мог работать ... ваша ссылка имела правильную структуру, например, UserAdmin / Index / test / True, в то время как мои привязки тегов имели амперсанд вместо косой черты . Я могу только догадываться об этом из-за того, что я использовал @ Model.DisplayName для sortValue. Я поддержал вас за это, так как это спасло меня ... Спасибо - person si2030; 06.05.2016

В этом случае не разделяйте свои действия. Вы можете так же легко сделать это одним действием:

public async Task<IActionResult> Index(string sortValue, bool showDeactivated)
{
    var sort = string.IsNullOrWhiteSpace(sortValue) ? "name_desc" : sortValue;

    return View(await _userAdminService.GetAllUsers(sort, showDeactivated));
}

Если параметр sortValue GET не указан, по умолчанию будет null, а если showDeactivated не указан, по умолчанию будет false.

person Will Ray    schedule 06.05.2016
comment
Это тоже работает ... не знал, что по умолчанию bool имеет значение false. Я тоже проголосовал за это. - person si2030; 07.05.2016

Последняя версия ASP.NET Core может справиться с этим:

[HttpGet("Index")]
public async Task<IActionResult> Index([FromQuery(Name ="sortValue")]string sortValue,[FromQuery(Name ="showDeactivated")] bool showDeactivated)
person Alexei Shcherbakov    schedule 21.08.2017