Blazor, событие об изменении модели в форме редактирования - PullRequest
0 голосов
/ 30 марта 2020

У меня есть таблица с элементами управления, привязанными к модели, и мне нужно вызывать функцию при изменении значений некоторых из этих элементов управления. (Пересчет итогов и налогов)

Таблица находится в форме редактирования, и элементы управления привязаны к модели, поэтому я не могу использовать событие onchange в элементах управления.

Что я пробовал:

  • использовать функции SetParametersAsyn c или OnParametersSetAsyn c, однако он срабатывает только при первой установке модели, а не при каждое изменение свойства в модели, как я и ожидал.
  • пытался использовать аксессор набора модели, однако, делая это и работая в режиме отладки, браузер вылетает, и в консоли отладки я получаю ошибка нарушения прав доступа без контекста:

    частный заказ Order {get {return order; } set {order = value; CalculateTotals (); }}

Программа «[11992] iis express .exe: трассировка программы» завершила работу с кодом 0 (0x0). Программа '[11992] iis express .exe' закрылась с кодом -1073741819 (0xc0000005) «Нарушение прав доступа».

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 30 марта 2020

Вы можете сделать что-то вроде этого:

 <EditForm EditContext="@EditContext">
    <DataAnnotationsValidator />

    <div class="form-group">
        <label for="amount">Amount: </label>
        <InputNumber Id="amount" Class="form-control" @bind- 
                                         Value="@Model.Amount"> 
        </InputNumber>
             <ValidationMessage For="@(() => Model.Amount)" />

    </div>
    <div class="form-group">
        <label for="items">Items: </label>
    <InputNumber Id="items" Class="form-control" @bind-Value="@Model.Items"> 
    </InputNumber>
        <ValidationMessage For="@(() => Model.Items)" />
    </div>

</EditForm>


@code
{
    private EditContext EditContext;
    private Order Model = new Order();


    protected override void OnInitialized()
    {
        EditContext = new EditContext(Model);
        EditContext.OnFieldChanged += EditContext_OnFieldChanged;

        base.OnInitialized();
    }

    private void EditContext_OnFieldChanged(object sender, 
                                                      FieldChangedEventArgs e)
    {
        Console.WriteLine(e.FieldIdentifier.FieldName);

         if (EditContext.Validate())
         {
            // You can validate the EditContext here, and do necessary 
            calculation 
         }

    }

    }

Надеюсь, это поможет ...

Обновление:

Я никогда не делал этого раньше, но позвольте мне Предлагаем следующее: Определите ваш дочерний компонент следующим образом:

ChildComponent.razor

<div class="form-group">
<label for="item">Item: </label>

 <select id="Item" class="form-control-sm" @bind="@Model.Item">
    @foreach (var item in items)
    {
        <option value="@item">@item</option>

    }
</select>

<ValidationMessage For="@(() => Model.Item)" />

</div>

@code
{

   [Parameter]
   public Order Model { get; set; }
}

В родительский компонент вставьте следующее в EditForm

Теперь вы можете выполнять различные операции в дочернем компоненте, как будто его код находится в EditForm.

Примечание: я надеюсь, что эта работа ... никогда не выполнялась раньше, и, конечно, я не выполнял этот код ...

Примечание. Здесь необходимо предоставить список элементов, либо передать его из родительского компонента в качестве параметра компонента, либо создать список элементов в дочернем компоненте, извлечь из базы данных, и др c. * * тысяча двадцать-один

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...