所以我在使用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>
studentToUpdate.FirstMidNames
为Carson
(原始),但在执行该函数后,它是Carsey
(新)。字符串Carsey
始终位于此&gt;请求&gt;表单&gt;结果视图中(其中包含表单中所有值的列表)。所以我理解TryUpdateModelAsync
函数以某种方式使用linq语句和表单结果来获取studentToUpdate
的新值,但我真的不知道它是如何以及在何处这样做吗?
答案 0 :(得分:10)
没有涉及太多技术细节。在提供的示例中调用TryUpdateModelAsync
if (await TryUpdateModelAsync<Student>(
studentToUpdate,
"",
s => s.FirstMidName, s => s.LastName, s => s.EnrollmentDate)){
//...
}
使用控制器当前Student
中的值更新指定的studentToUpdate
实例ControllerContext
,该值将填充请求中提供的数据。它使用lambda表达式来表示在尝试更新时需要包含在当前模型中的顶级属性。它只需要这些属性的值并更新模型。
因此,在上面的示例中,即使整个模型由表单提供,它也只会更新指定实例上的FirstMidName
,LastName
和EnrollmentDate
。
答案 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