【问题标题】:Var assigned in Blazor component are linked with the main var在 Blazor 组件中分配的 var 与主 var 链接
【发布时间】:2020-08-21 16:46:07
【问题描述】:

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

客户端项目中 Blazor 的 ASP.NET Core 托管项目我有一个带有一些 inputText 的组件。我将“Person”类用作模型,并在 OnInitializedAsync() 上从 Person 分配 Person2, 通过inputText修改模型(Person)时,同时修改了Person,不知道为什么。 这个过程是因为我想在用户修改它之前保持 Person 状态,并且如果用户单击“取消”按钮能够返回到以前的状态。 我该怎么做? 谢谢

小米组件:

<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;
}}

【问题讨论】:

    标签: blazor blazor-client-side


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!我没想到!!我用 localStorage 来存储其他东西,我也可以用它来做这个
    【解决方案2】:

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

    我相信必须对 persones 类进行一些实例化,因为在 OnInitialized() 中,如果它是类,则将 null 分配给 null,而 EditForm 会抱怨 null '事物'。

    【讨论】:

    • 您对引用类型分配是正确的,我分配的是一个类。我想我将不得不一一映射所有属性,这是我想要避免的,我不知道我该怎么做。关于“将 null 分配给 null”Person1 不为 null,因为它是一个参数,因此 EditForm 不会抱怨。
    猜你喜欢
    • 2018-04-16
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多