#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, и он работает для меня.