我可能無法了解Blazor中某些內容的工作原理,但這是我的問題所在:
每當我要編輯一個對象(例如People
對象)時,我都會在表的@page "/people"
選擇它,然後將我重定向到@page "people/edit/id"
。在@page "people/edit"
我有一個EditForm
其中InputText
對應於people模型和@bind
值,一切正常,它正確加載了數據。
問題是當我編輯一些輸入而不保存數據時,只需修改其值,然後返回到@page "people"
,或在任何地方修改對象。
我什至設置了一個斷點,以觀察通過Entity Framework Core從數據庫中拉出的對象,它也顯示了修改後的版本,但是檢查數據庫表,它似乎沒有受到影響。
聽起來不可能,但是我嘗試了全新的項目,或者在視頻教程中嘗試了其他人的項目,嘗試複製並且做了同樣的事情,所以這有什麼用呢?
@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服務器)或客戶端(Blazor wasm)上獲得實際的.NET運行時以太,因此您的對象得以保留並保持其狀態。