Не обновляется список объектов шаблона представления после GET-запроса к контроллеру в asp net core
Проект asp net core 3.1, Entity framework core 3. Проект с представлениями mvc.
Есть 3 сущности - Friend, City, Street:
[Table("friend")]
public partial class Friend
{
[Key]
[Column("Id_Friend")]
public long IdFriend { get; set; }
[Column("Name_", TypeName = "varchar(256)")]
public string Name { get; set; }
[Column("City_id")]
public int? CityId { get; set; }
[Column("Street_id")]
public int? StreetId { get; set; }
[Column("User_id")]
public long? UserId { get; set; }
[ForeignKey(nameof(CityId))]
[InverseProperty("Friends")]
public virtual City City { get; set; }
[ForeignKey(nameof(StreetId))]
[InverseProperty("Friends")]
public virtual Street Street { get; set; }
[ForeignKey(nameof(UserId))]
[InverseProperty("Friends")]
public virtual User User { get; set; }
}
[Table("city")]
public partial class City
{
public City()
{
Friends = new HashSet<Friend>();
Streets = new HashSet<Street>();
}
[Key]
[Column("Id_City")]
public int IdCity { get; set; }
[Column(TypeName = "varchar(256)")]
public string Name { get; set; }
[InverseProperty("City")]
public virtual ICollection<Friend> Friends { get; set; }
[InverseProperty("City")]
public virtual ICollection<Street> Streets { get; set; }
}
[Table("street")]
public partial class Street
{
public Street()
{
Friends = new HashSet<Friend>();
}
[Key]
[Column("Id_Street")]
public int IdStreet { get; set; }
[Column(TypeName = "varchar(256)")]
public string Name { get; set; }
[Column("City_id")]
public int? CityId { get; set; }
[ForeignKey(nameof(CityId))]
[InverseProperty("Streets")]
public virtual City City { get; set; }
[InverseProperty("Street")]
public virtual ICollection<Friend> Friends { get; set; }
}
По плану пользователь добавляет друга (Friend) и вводит данные о нем - имя, город, улицу, номер дома.
При этом при выборе города список улиц должен обновляться в соответствии с выбранным городом - должны отобразиться улицы из коллекции ICollection Streets объекта сущности City.
Для этого был добавлен дополнительный метод "GetStreets" в контроллер:
public class FriendsController : Controller
{
private readonly VoterCollectorContext _context;
public FriendsController(VoterCollectorContext context)
{
_context = context;
}
// GET: Friends/Create
[HttpGet]
public IActionResult Create()
{
int selectedIndexCity = 1;
ViewData["CityId"] = new SelectList(_context.City, "IdCity", "Name", selectedIndexCity);
ViewData["DistrictId"] = new SelectList(_context.District, "IdDistrict", "Name");
ViewData["FieldActivityId"] = new SelectList(_context.Fieldactivity, "IdFieldActivity", "Name");
ViewData["GroupUId"] = new SelectList(_context.Groupu, "IdGroup", "Name");
ViewData["HouseId"] = new SelectList(_context.House, "IdHouse", "Name");
ViewData["MicroDistrictId"] = new SelectList(_context.Microdistrict, "IdMicroDistrict", "Name");
ViewData["PollingStationId"] = new SelectList(_context.PollingStation, "IdPollingStation", "Name");
//ViewData["StreetId"] = new SelectList(_context.Street.Where(s => s.CityId==1), "IdStreet", "Name");
SelectList streets = new SelectList(_context.Street.Where(s => s.CityId == 1), "IdStreet", "Name");
ViewBag.Streets = streets;
ViewData["UserId"] = new SelectList(_context.User, "IdUser", "FamilyName");
return View();
}
[HttpGet]
public IActionResult GetStreets(int? id)
{
SelectList streets = new SelectList(_context.Street.Where(s => s.CityId == id).ToList());
return PartialView(streets);
}
// POST: Friends/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("IdFriend,FamilyName,Name,PatronymicName,DateBirth,CityId,DistrictId,StreetId,MicroDistrictId,HouseId,Building,Apartment,Telephone,PollingStationId,Organization,FieldActivityId,PhoneNumberResponsible,DateRegistrationSite,VotingDate,Voter,Adress,Qrcode,Description,UserId,GroupUId")] Friend friend)
{
List<Friend> searchFriend = _context.Friend.Where(frnd => frnd.Name.Equals(friend.Name) && frnd.FamilyName.Equals(friend.FamilyName) && frnd.PatronymicName.Equals(friend.PatronymicName) && frnd.DateBirth.Value.Date == friend.DateBirth.Value.Date).ToList();
if (searchFriend.Count == 0)
{
if (ModelState.IsValid)
{
User userSave = _context.User.Where(u => u.UserName.Equals(User.Identity.Name)).FirstOrDefault();
friend.UserId = userSave.IdUser;
//friend.GroupUId = userSave.Groupsusers.First().GroupUId;
_context.Add(friend);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData["CityId"] = new SelectList(_context.City, "IdCity", "IdCity", friend.CityId);
ViewData["DistrictId"] = new SelectList(_context.District, "IdDistrict", "IdDistrict", friend.DistrictId);
ViewData["FieldActivityId"] = new SelectList(_context.Fieldactivity, "IdFieldActivity", "IdFieldActivity", friend.FieldActivityId);
ViewData["GroupUId"] = new SelectList(_context.Groupu, "IdGroup", "IdGroup", friend.GroupUId);
ViewData["HouseId"] = new SelectList(_context.House, "IdHouse", "IdHouse", friend.HouseId);
ViewData["MicroDistrictId"] = new SelectList(_context.Microdistrict, "IdMicroDistrict", "IdMicroDistrict", friend.MicroDistrictId);
ViewData["PollingStationId"] = new SelectList(_context.PollingStation, "IdPollingStation", "IdPollingStation", friend.PollingStationId);
ViewData["StreetId"] = new SelectList(_context.Street, "IdStreet", "IdStreet", friend.StreetId);
ViewData["UserId"] = new SelectList(_context.User, "IdUser", "Password", friend.UserId);
return View(friend);
}
else return Content("Данный пользователь уже был внесен в списки ранее!");
}
}
Было создано частичное представления для улиц (Streets.cshtml):
@model IEnumerable<voteCollector.Models.Street>
<select id="street" name="Street">
@foreach (var item in Model)
{
<option value="@item.IdStreet">@item.Name</option>
}
</select>
Данное представление "ViewBag.Streets" было присвоено на основном представлении объекту:
<div class="form-group">
<label asp-for="StreetId" class="control-label"></label>
<select id="StreetId" asp-for="StreetId" class="form-control" asp-items="ViewBag.Streets"></select>
</div>
Для передаче id выбранного города на сервер для обновления списка написал js-функцию c запросом ajax:
@section Scripts {
<script>
$(function () {
$("#CityId").change(function () {
var id = $('#CityId').val();
$.ajax({
type: 'GET',
url: '@Url.Action("GetStreets")/' + id,
success: function (data) {
$('#StreetId').replaceWith(data);
},
error: function (result, status, er) {
alert("error: " + result + " status: " + status + " er:" + er);
}
});
});
});
</script>
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
JS-функция срабатывает, контроллер отрабатывает и формирует новый список, но на страницу он не возвращается. Выдает ошибку сервера:
jquery.min.js:2 GET http://localhost:18246/Friends/GetStreets/3 500 (Internal Server Error) send @ jquery.min.js:2 ajax @ jquery.min.js:2 (anonymous) @ Create:257 dispatch @ jquery.min.js:2 v.handle @ jquery.min.js:2 ListPicker._handleMouseUp @ unknown
Кто знает подскажите, где неверно сделал?
На фронт, судя по данным отладчика браузера, с сервера ничего не приходит

После правки получил следующий Responce:
System.InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Microsoft.AspNetCore.Mvc.Rendering.SelectList', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable
1[voteCollector.Models.Street]'. at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary.EnsureCompatible(Object value) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary..ctor(ViewDataDictionary source, Object model, Type declaredModelType) at lambda_method(Closure , ViewDataDictionary ) at Microsoft.AspNetCore.Mvc.Razor.RazorPagePropertyActivator.CreateViewDataDictionary(ViewContext context) at Microsoft.AspNetCore.Mvc.Razor.RazorPagePropertyActivator.Activate(Object page, ViewContext context) at Microsoft.AspNetCore.Mvc.Razor.RazorPageActivator.Activate(IRazorPage page, ViewContext context) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts) at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable1 statusCode) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable1 statusCode) at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, String contentType, Nullable1 statusCode) at Microsoft.AspNetCore.Mvc.ViewFeatures.PartialViewResultExecutor.ExecuteAsync(ActionContext context, PartialViewResult result) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters() --- End of stack trace from previous location where exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() --- End of stack trace from previous location where exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)HEADERS ======= Accept: / Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7 Connection:
