TryUpdateModelAsync中发生了什么

MrJ*_*eno 14 c# asp.net-core-mvc

所以我正在使用EF 6在ASP.NET Core上进行这个微软教程,它只是通过编辑控制器更新模型.

有一段代码让我感到非常困惑,我想象(也许是希望)对你们很多人来说并不那么令人困惑.

var studentToUpdate = await _context.Students.SingleOrDefaultAsync(s => s.ID == id);

if (await TryUpdateModelAsync<Student>(
          studentToUpdate, 
          "", 
           s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate))
// goes on to save the context
Run Code Online (Sandbox Code Playgroud)

所以,这个控制器作为参数唯一的东西是int id,它是如何获得的studentToUpdate.我在这里不完全熟悉的是,它从何处获取更新值?

我知道的:

  • TryUpdateModelAsync<Student>
    • 第一个参数:要更新的模型
    • 第二个参数:引用中的前缀(?):查找中的值时使用的前缀.
    • 第三个论点:我怀疑的linq语句与我正在寻找的解决方案有关.
  • 运行调试器并在执行函数之前studentToUpdate.FirstMidNamesCarson(原始)但是在执行函数之后它是Carsey(新的).该字符串Carsey始终位于此> Request> Form> Results View(其中包含表单中所有值的列表).

所以我理解该TryUpdateModelAsync函数以某种方式使用linq语句和表单结果来获取新值studentToUpdate,但我真的不知道它是如何以及在何处执行此操作?

Nko*_*osi 11

没有涉及太多的技术细节.TryUpdateModelAsync在提供的示例中调用

if (await TryUpdateModelAsync<Student>(
      studentToUpdate, 
      "", 
       s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate)){
    //...
}
Run Code Online (Sandbox Code Playgroud)

使用控制器当前的值更新指定的Student实例,该值将填充请求中提供的数据.它使用lambda表达式来表示在尝试更新时需要包含在当前模型中的顶级属性.它将仅采用这些属性的值并更新模型.studentToUpdateControllerContext

所以在上面的例子中,即使整个模型由形式提供它只会更新FirstMidName,LastName以及EnrollmentDate在指定的实例.