在 Blazor 组件中分配的变量与主变量链接

Var assigned in Blazor component are linked with the main var

在 Blazor 组件中分配的变量与主变量链接。

A ASP.NET 客户端项目中 Blazor 的核心托管项目我有一个带有一些 inputText 的组件。我使用模型 a 'Person' class 并在 OnInitializedAsync() 上从 Person 分配 Person2, 当通过inputText修改模型(Person)时,Person也同时被修改,不知道为什么。 这个过程是因为我想在用户修改它之前保持 Person 状态,并且如果用户点击按钮 'Cancel' 能够回到之前的状态。 我该怎么做? 谢谢

小米组件:

<EditForm Model="Person" OnValidSubmit="SendPerson" class="form-inline col-11">
    <DataAnnotationsValidator />
    <div class="m-auto">
        <InputText class="" @bind-Value="@Person.Nom" />
        <ValidationMessage For="@(() => Person.Nom)" />
    </div>

    <div class="m-auto">
        <InputText class="" @bind-Value="@Person.Cognom1" />
        <ValidationMessage For="@(() => Person.Cognom1)" />
    </div>

    <div class="m-auto">
        <InputDate class="" @bind-Value="@Person.Cognom2" />
        <ValidationMessage For="@(() => Person.Cognom2)" />
    </div>
    <button class="btn btn-primary m-auto" type="submit">Send</button>

</EditForm>
<button class="btn btn-warning col-1 m-auto" @onclick="CancelPerson"><span class="glyphicon glyphicon-remove"></span>Cancel</button>

@code {
[Parameter]
public persones Person { get; set; }

public persones Person2 { get; set; }

async Task SendPerson()
{
    var result = await Http.PostJsonAsync<persones>("api/Persones/SetPerson", Person);
}

protected override void OnInitialized()
{
    base.OnInitialized();
    Person2 = Person;
}

private void CancelPerson()
{
    Person = Person2;
}}

当您将引用类型 (value-vs-reference-typ) 分配给另一个变量时,您基本上是在存储对象的引用(指针),而不是复制该对象。当您更改从 Person 变量引用的 persones 对象时,具有相同引用的 Person2 变量也会更改。

我相信必须有一些人的实例化 class,因为在 OnInitialized() 中,如果它是 class,您将 null 分配给 null,而 EditForm 会抱怨 null 'things'.

这是因为两个变量包含相同的对象并指向内存中的相同位置(引用类型)。但是忘了这... 您应该在对象可供使用之前立即将其存储在本地存储中。如果需要,例如,您的用户按下取消按钮,您可以从本地存储中读取该值。这就是我们拥有本地存储的原因。它在您创建向导组件、购物车组件等时非常有用。 Blazor Server Apps 和 Blazor WebAssembly Apps 都可以使用它。您可以使用 JSInterop 直接调用 JavaScript localStorage 和 sessionStorage,或者最好使用由社区或 Blazor 团队创建的 Blazor 库。