TryUpdateModelAsync

时间:2017-06-15 12:02:54

标签: c# asp.net-core-mvc

所以我在使用EF 6的ASP.NET Core上执行此操作microsoft tutorial,它只是通过编辑控制器更新模型。

有一段代码让我感到非常困惑,我想象(也许希望)并不会让很多人感到困惑。

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

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

我所知道的:

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

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

2 个答案:

答案 0 :(得分:10)

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

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

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

因此,在上面的示例中,即使整个模型由表单提供,它也只会更新指定实例上的FirstMidNameLastNameEnrollmentDate

答案 1 :(得分:0)

我认为最令人困惑的是第三个参数:linq 语句。

每个 linQ 表达式 [ const otherParams = { headers: { "content-type": "application/json; charset=UTF-8" }, body: JSON.stringify(product), method: 'POST' }; console.log(otherParams); const response = await fetch('/Item/GetDetailPageURL', otherParams) .then(response => { response.json(); console.log(response); window.open(response.url, "_blank"); }) .then(data => console.log(data)); ] 将与表中的每一列或约束(外键、索引、...)(我们在 EF MVC 中称为导航属性)匹配。

因此,第三个参数决定应该更新(异步)到 Datebase 的内容。它通过模型绑定 Link to model binding