Ну, вы публикуете идентификатор только для Tower
, и это действительно заполняется.Больше ничего для Tower
не публикуется, поэтому, конечно, все остальные свойства имеют значение null или значение по умолчанию.Я не уверен, почему вы думаете, что это только начинает происходить в 2.2, как это всегда было.На самом деле, это будет так, независимо от того, какую платформу вы используете.Это может быть Django или Ruby on Rails, и реквизиты Tower
все равно будут нулевыми, потому что вы не публикуете ни одного из них.
HTTP - это протокол без сохранения состояния.Ничего не существует, кроме того, что приходит через сам запрос.Нет никакой памяти о том, что эти свойства использовали , потому что нет сведений о том, что был даже сделан предыдущий запрос.Вы можете вставить что-то вроде сеансов здесь, но это по сути фальшивое состояние.Сервер сохраняет данные, связанные с идентификатором сеанса, а затем передает этот идентификатор сеанса клиенту через cookie-файл.Затем клиент должен возвращать этот файл cookie, содержащий идентификатор сеанса, при каждом последующем запросе для восстановления сеанса.Даже в этом случае данные, по сути, все еще являются частью запроса, они просто приходят в качестве идентификатора для определенного набора сохраненных данных на стороне сервера, а не для всего набора данных.
В любом случае, это легко решается с помощью нескольких настроекв свой код вы должны внести независимо.Во-первых, вы никогда не должны напрямую связываться с классом сущностей.Для этого есть ряд причин, но главная проблема заключается в чрезмерной публикации.Имея код, который есть у вас сейчас, клиент может изменить отправленные данные, чтобы изменить что-то вроде идентификатора вашей сущности, и вы в конечном итоге измените сущность с этим id, а не той, которая была на самом делередактируется.Другое правило, связанное с этим, заключается в том, что вы никогда не должны напрямую сохранять что-либо, опубликованное пользователем, по многим из тех же причин.
Вместо этого вы должны связываться с моделью представления, и эта модель представления должна содержать только свойстваВы действительно хотите позволить пользователю редактировать.Затем вы извлекаете сущность только что из базы данных и отображаете на ней значения, переданные из модели представления, прежде чем окончательно сохранить сущность.
public async Task<IActionResult> Edit(NewViewModel value)
{
if (!ModelState.IsValid)
{
PopulateDropDowns();
return View(value);
}
var entity = await _newBL.GetById(id);
if (entity == null)
return NotFound();
entity.Title = value.Title;
entity.Message = value.Message;
entity.TowerID = value.TowerID;
entity.Resources = _files;
await _newBL.Update(entity);
return RedirectToAction(nameof(Index));
}
Об отображении можно позаботиться с помощью библиотеки, подобнойAutoMapper, если вы предпочитаете.