Var, назначенные в компоненте Blazor, связаны с основной переменной - PullRequest
0 голосов
/ 06 мая 2020

Var, назначенная в компоненте Blazor, связана с основной переменной.

A ASP. NET Базовый размещенный проект Blazor в клиентском проекте У меня есть компонент с некоторым inputText. Я использую в качестве модели класс «Человек» и назначаю Person2 из Person в OnInitializedAsyn c (). Когда модель (Person) изменяется через inputText, Person изменяется одновременно, и я не знаю почему. Этот процесс вызван тем, что я хочу сохранить состояние Person до того, как пользователь изменит его, и смогу go вернуться в предыдущее состояние, если пользователь нажмет кнопку «Отмена». Как мне это сделать? Спасибо

Mi компонент:

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

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Когда вы назначаете ссылочный тип ( value-vs-reference-typ ) другой переменной, вы в основном сохраняете ссылку (указатель) на объект, и вы не делаете копию этого объекта . Когда вы вносите изменения в объект persones, на который ссылается переменная Person, переменная Person2, имеющая ту же ссылку, также изменяется. () вы присваиваете null значению null, если это класс, а EditForm будет жаловаться на пустые «вещи».

0 голосов
/ 06 мая 2020

Это потому, что обе переменные содержат один и тот же объект и указывают на одно и то же место в памяти (ссылочные типы). Но забудьте об этом ... Вместо этого вы должны сохранить свой объект в локальном хранилище непосредственно перед тем, как он станет доступным для использования. Если возникнет необходимость, например, когда ваш пользователь нажимает кнопку отмены, вы можете прочитать это значение из локального хранилища. Вот почему у нас есть локальное хранилище. Он часто используется при создании компонентов мастера, компонентов корзины и т. Д. Его можно использовать как в серверных приложениях Blazor, так и в приложениях Blazor WebAssembly. Вы можете использовать JSInterop для прямого вызова JavaScript localStorage и sessionStorage или, желательно, использовать библиотеки Blazor, созданные сообществом или командой Blazor.

...