繁体   English   中英

当ModelState无效时,如何在使用Entity Framework Core重新加载相关实体时保留实体的原始值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM