我可能不知道Blazor中的一些东西是如何工作的,但我的问题是:
每当我想编辑一个对象(例如People
对象(时,我都会在@page "/people"
中从表中选择它,然后重定向到@page "people/edit/id"
。在@page "people/edit"
中,我有一个EditForm
,InputText
对应于人模型和@bind
值,一切正常,它正确加载了数据。
问题是,当我编辑一些输入而不保存数据时,只需修改其值,然后返回到@page "people"
,或者在任何地方,对象都会被修改。
我甚至放了一个断点来观察通过实体框架核心从数据库中提取的对象,它也显示了修改后的版本,但检查数据库表,它似乎没有受到影响。
这听起来不可能,但我尝试了全新的项目,或者其他人在视频教程中进行项目,尝试复制并做同样的事情,那么这里有什么用呢?
@page "/People/edit{id}"
@code {
[Parameter] public string id { get; set; }
Person person = new Person();
protected override async Task OnParametersSetAsync()
{
person = await PersonService.GetByIdAsync(id);
}
}
首先,如果您将某个对象作为EditForm
的模型并对其进行一些更改,则所有更改都会立即反映在对象中,但不会在单击提交后反映出来。其次,当您从数据库中提取对象时,它会附加到DbContext并保持附加状态,除非您显式分离它。查询已附加到上下文的实体时,上下文不会再次查询数据库,而是为您提供附加的实体。如果你对它做了一些改变,你就会得到这些改变。但在执行context.SaveChanges
之前,这些更改不会保存到数据库中,所以当您看到实际的数据库时,您会看到未更改的数据。
与Net Core MVC的区别在于,Net Core MVC是无状态的。尽管在.cshtml
文件中使用了对.NET对象的引用,但它们仅在一次查询中使用,并在将响应发送到客户端后被销毁。当您使用Blazor时,您将在服务器(Blazor-server(或客户端(Blazor wasm(上获得实际的.NET运行时以太,因此您的对象将保留并保持其状态。