Как сохранить исходные значения объекта при перезагрузке связанных объектов с использованием Entity Framework Core, когда ModelState недопустим? - PullRequest
0 голосов
/ 24 июня 2019

Использование ASP.NET Core и Entity Framework Core.

При редактировании записи я также загружаю связанные «дочерние» объекты, используемые для отображения, в форме редактирования.

Если пользователь отправляет форму с пропущенными обязательными полями, то ModelState.IsValid имеет значение false. Пока все хорошо.

При возврате необновленных значений пользователю (с сообщением об ошибке), как я могу сохранить исходные значения, опубликованные пользователем, а также перезагрузить связанные сущности?

В следующем упрощенном примере dbcontext запрашивает запись клиента и включает связанную таблицу состояний для отображения имени состояния.

Если ModelState недопустим, клиентская запись возвращается пользователю со значениями, предоставленными пользователем, но на этом этапе все связанные .Include объекты являются нулевыми. Как я могу заново заполнить .Include сущности без перезаписи представленной модели представления?

// GET
public async Task<IActionResult> Edit(int clientId)
{
    var client = _context.Client
                         .Include(x => x.State)
                         .Where(w => w.client_id == clientId
                         .FirstOrDefault();
    return View(client);
}

// POST
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(clientModel)
{
   //verify: last_name
   if (clientModel.last_name == null)
   {
       ModelState.AddModelError(string.Empty, "Last name is required");
   }

   if (ModelState.IsValid)
   {
      // Update the record and redirect
      await _context.SaveChangesAsync();
      return RedirectToAction(nameof(Index), new { client_id = clientModel.client_id });
   }

   // model state is not valid! Return record submitted to the edit view
   // *** MISSING THE VALUES FROM THE RELATED ENTITY clientModel.State at this point
   return View(clientModel);
}

1 Ответ

0 голосов
/ 24 июня 2019

Сначала свойство навигации State должно быть virtual, затем вы можете загрузить его с помощью await _context.Entry(clientModel).Reference(x => x.State).LoadAsync();

, если связанный является коллекцией, тогда вы можете использовать await _context.Entry(clientModel).Collection(x => x.Collection).LoadAsync();

другойспособ получить данные из контекста и назначить их

var client = _context.Client
                         .Include(x => x.State)
                         .Where(w => w.client_id == clientId
                         .FirstOrDefault(); 


 //or just get the state .. var state = _context.State..
clientModel.State = client.State;
return View(clientModel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...