[英]How to keep original values of an entity while reloading related entities using Entity Framework Core when ModelState is not valid?
使用ASP.NET核心和实体框架核心。
编辑记录时,我还在编辑表单中加载用于显示目的的相关“子”实体。
如果用户提交缺少必填字段的表单,则ModelState.IsValid
为false。 到现在为止还挺好。
将非更新值返回给用户时(带有错误消息),如何保留用户发布的原始值并重新加载相关实体?
在下面的简化示例中, dbcontext
查询客户端记录并包含关联的状态表以显示状态名称。
如果ModelState
无效,则使用用户提交的值将客户端记录返回给用户 - 但此时所有相关的.Include
实体都为null。 如何在不覆盖提交的视图模型的情况下重新填充.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);
}
首先, State
导航属性应该是virtual
然后您可以使用await _context.Entry(clientModel).Reference(x => x.State).LoadAsync();
加载它await _context.Entry(clientModel).Reference(x => x.State).LoadAsync();
如果related是一个集合,那么你可以使用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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.