在 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 库。
在 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 库。