На сервер в APIController приходят не верные данные в POST-запросе ajax

Пытаюсь отправить на сервер POST-запрос ajax для обновления списка:

Контроллер:

[Route("api/[controller]")]
    [ApiController]
    public class StreetsAPIController : ControllerBase
    {
        private readonly VoterCollectorContext _context;

        public StreetsAPIController(VoterCollectorContext context)
        {
            _context = context;
        }

        [HttpPost("search")]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult<IEnumerable<Street>>> GetStreets(CityDTO citySelected)
        {
            return await _context.Street.Where(s => s.CityId == citySelected.CityId).ToListAsync();
        }
    }

Модель dto принимаемого контроллером объекта:

public class CityDTO
    {
        public int CityId { get; set; }
        public string NameCity { get; set; }
    }

На странице представления добавил функцию генерации ключа и скрытое поле с ключом как описывалось здесь https://ru.stackoverflow.com/questions/803903/Проверить-antiforgerytoken-в-ajax-запросе:

@model voteCollector.Models.Friend

@{
    ViewData["Title"] = "Create";
}
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions {
    public string GetAntiXsrfRequestToken()
    {
        return Xsrf.GetAndStoreTokens(Context).RequestToken;
    }
}

<h1>Create</h1>

<h4>Friend</h4>
<hr />
<div class="row">
    <input type="hidden" id="RequestVerificationToken"
           name="RequestVerificationToken" value="@GetAntiXsrfRequestToken()">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="CityId" class="control-label"></label>
                <select id="CityId" asp-for="CityId" class="form-control" asp-items="ViewBag.CityId"></select>
            </div>
            <div class="form-group">
                <label asp-for="StreetId" class="control-label"></label>
                <select id="StreetId" asp-for="StreetId" class="form-control" asp-items="ViewBag.StreetId"></select>
            </div>
        </form>
    </div>
</div>

Написал js функцию, которая отправляет POST-запрос с данными и получающая данные в ответ:

@section Scripts {
    <script>
        $(function () {
            $("#CityId").change(function () {
                var formData = new FormData();
                var idCity = $("#CityId").val();
                formData.append('CityId', Number.parseInt($('#CityId').val()));
                $.ajax({
                    url: "http://localhost:18246/api/streetsAPI/search",
                    headers:
                    {
                        'Accept': 'application/json',
                        "RequestVerificationToken": $('#RequestVerificationToken').val()
                    },
                    type: 'POST',
                    contentType: "application/json;charset=utf-8",
                    data: JSON.stringify(formData),
                    success: function (data) {
                        $('#StreetId').replaceWith(data);
                    },
                    error: function (result, status, er) {
                        alert("error: " + result + " status: " + status + " er:" + er);
                    }
                });
            });
        });
    </script>
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}

Функция срабатывает, запрос до контроллера доходит, но поле "CityId" в объекте "CityDTO citySelected", который принимает контроллер всегда равно "0", всегда.

Проверял какое значение берется из объекта html $("#CityId").val() - оно не равно "0", но на сервер приходит "0".

Кто знает, подскажите где ошибка?


Ответы (0 шт):