Каскадный выпадающий список с использованием asp.net ядро 3.1 mvc

#javascript #asp.net-core

#javascript #asp.net-ядро

Вопрос:

Я не могу заполнить поле CityId выбора через Ajax, когда выбираю страну из списка CountryId выбора.

Я попытался изменить версию jquery, и она по-прежнему не работает.

Может кто-нибудь сказать мне, в чем моя ошибка?

Вид:

 <div class="row">
    <div class="col-md-4 offset-md-4">
    <form method="post">
        <div asp-validation-summary="ModelOnly"></div>
        <div class="form-group">
            <label asp-for="CountryId" class="control-label"></label>
            <select asp-for="CountryId" asp-items="Model.Countries" class="form-control"></select>
            <span asp-validation-for="CountryId" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="CityId" class="control-label"></label>
            <select asp-for="CityId" asp-items="Model.Cities" class="form-control"></select>
            <span asp-validation-for="CityId" class="text-danger"></span>
        </div>              
    </form>
    </div>
</div>
  

Контроллер:

 public async Task<JsonResult> GetCitiesAsync(int countryId)
{
    var country = await _countryRepository.GetCountryWithCitiesAsync(countryId);
    return Json(country.Cities.OrderBy(c => c.Name));
}
  

Код Javascript для вызова GetCitiesAsync через Ajax:

 @section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    <script type="text/javascript">
        $(document).ready(function () {
            $("#CountryId").change(function () {
                $("#CityId").empty();
                $.ajax({
                    type: 'POST',
                    url: '@Url.Action("GetCitiesAsync")',
                    dataType: 'json',
                    data: { countryId: $("#CountryId").val() },
                    success: function (cities) {
                        $("#CityId").append('<option value="0">(Select a city...)</option>');
                        $.each(cities, function (i, city) {
                            $("#CityId").append('<option value="'
                                  city.id   '">'
                                  city.name   '</option>');
                        });
                    },
                    error: function (ex) {
                        alert('Failed to retrieve cities.'   ex);
                    }
                });
                return false;
            })
        });
    </script>
}
  

Спасибо!

Ответ №1:

Для меня это работает нормально.

Я сделал небольшой рабочий пример из вашего кода: dotnetfiddle.

Обратите внимание, что я не изменил ваш js-код. это означает, что проблема заключается в одном из следующих:

  • Вы возвращаете данные json в форме, отличной от ожидаемой со стороны клиента.
  • У вас поврежден скрипт.
  • У вас отсутствует скрипт.

Проверьте консоль браузера на наличие ошибок, если их нет, попробуйте изменить запущенные скрипты, т.е. Измените свой CDN, если вы его используете.

Пример кода:

Вид:

 <div class="container">
    <div class="col-md-6 col-md-offset-3">
        @using (Html.BeginForm())
        {
            <select class="form-control" name="CountryId" id="CountryId">
                <option value="0" selected>Select</option>
                <option value="1">US</option>
                <option value="2">UK</option>
            </select>
            <select class="form-control" name="CityId" id="CityId">
            </select>
        }
    </div>
</div>
  

Javascript:

 $(function()
{       
    $("#CountryId").change(function () 
    {
        $("#CityId").empty();
        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetCitiesAsync")',
            dataType: 'json',
            data: { countryId: $("#CountryId").val() },
            success: function (cities) {
                if (cities.length == 0)
                   return;

                $("#CityId").append('<option value="0">(Select a city...)</option>');
                $.each(cities, function (i, city) {
                    $("#CityId").append('<option value="'
                          city.id   '">'
                          city.name   '</option>');
                });
            },
            error: function (ex) {
                alert('Failed to retrieve cities.'   ex);
            }
        });
        return false;
    })

});
  

Контроллер:

 [HttpPost]
public JsonResult GetCitiesAsync(int countryId)
{               
    if (countryId == 1)
    { 
        return Json(new List<dynamic>() { new { name = "NewYork", id = 1 }, new { name = "LosAngeles", id = 2 }});
    }
    else if (countryId == 2)
    {   
        return Json(new List<dynamic>() { new { name = "London", id = 1 }, new { name = "Manchester", id = 2 }}); 
    }
    else
    {
        return Json("");
    }
}
  

Комментарии:

1. Привет, HMZ, спасибо за ваш ответ, я изменил cdn, и он работает для меня.