Asp.Net Core MVC - сложная модель не привязана к действию Get Controller - PullRequest
0 голосов
/ 05 ноября 2019

Произошло несоответствие где-то между моим View и Controller, в результате чего последний получает сложный объект, полный нулевых значений.

[HttpGet("find")]
[ProducesResponseType(typeof(PagableResults<UserDetails>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerOperation("FindUsers")]
public async Task<IActionResult> FindUsers([FromQuery]FindUsersSearchFilter searchFilters)

И объект searchFilters определен так:

public class FindUsersSearchFilter
{
    public int? Page { get; set; }

    public string Username { get; set; }

    public string Firstname { get; set; }

    public string Surname { get; set; }
}

Представление отправляет данные в строке запроса (потому что это метод get) следующим образом:

/find?SearchFilters.Page=1&SearchFilters.Firstname=foo&SearchFilters.Surname=bar&SearchFilters.Username=

Однако, если вы отлаживаете действие контроллера, достигается точка останова, но FindUsersSearchFilter полученметод имеет нулевое значение для каждого свойства.

То, что я пробовал:

  • Привязка (Prefix = "SearchFilters") к действию контроллера.
  • Привязка («Страница, Имя, Фамилия, Имя пользователя») к действию контроллера
  • Изменение URL-адреса вручную для удаления префикса и изменения заглавной буквы
  • Удаление [FromQuery]

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

1 Ответ

2 голосов
/ 05 ноября 2019

Запрос неверный. Это должно быть:

/find?Page=1&Firstname=foo&Surname=bar&Username=

Когда вы префиксируете все свои свойства с помощью SearchFilters, механизм привязки, скорее всего, ищет вложенное свойство, например searchFilters.SearchFilters.FirstName.

Таким образом, удаление префикса должнозаставить его работать.

Если вам действительно нужно использовать этот синтаксис в запросе;затем создайте другой класс, подобный этому:

public class SearchFilterContainer
{
    public FindUsersSearchFilter SearchFilters { get; set; } = new FindUsersSearchFilter();
}

И передайте это в действии в качестве параметра вместо этого, например, так:

[HttpGet("find")]
[ProducesResponseType(typeof(PagableResults<UserDetails>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerOperation("FindUsers")]
public async Task<IActionResult> FindUsers([FromQuery]SearchFilterContainer searchFilters)

Затем внутри вашего контроллера вы можете получить доступ к модели, подобной этой searchFilters.SearchFilters.FirstName

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...