0

I am using .Net Core 6 and Blazor Server side to maintain single page.

I am little bit confused, because UI updates/modify the InputSelect element differently. Example. I have select list of where I put priority numbers by order. By default priority is 1, so before choosing priority I have list 1,1,1. Assume, that user change priority to 5. On backend I put 1, by requirements. The issue is that, when user choose 2 (it is next priority and by measurements it is by order and all ok) work fine and selected 2 priority. BUT when user choose > 2, InputSelect not correctly refresh InputSelect. So element have attribute selected, but actually not selected. By the requirements when user choose priority more then 2, it will change to 1 - previous priority. Shadow-root is old and not modified!

2 day I am looking for solution. Please, help me to understand whats wrong?

My code is below. On Razor file

 <InputSelect @key="@(Beneficiary.ID+"_prior")"
                 id="@(Beneficiary.ID+"_select")"
                 class="form-control"
                 disabled="@Beneficiary.Style.DisableField.isBeneficiarytypeDisabled"
                 Value="Beneficiary.EntryOrder"
                 ValueExpression="@(() => Beneficiary.EntryOrder)"
                 ValueChanged="@((int priority) => SetPriority(priority))">
        @foreach (SelectListItem item in Beneficiary.BeneficiaryEntryOrder)
        {
            <option id="@(Beneficiary.ID+"_"+item.Value+"_option")" value="@item.Value" disabled="@item.Disabled" selected="@item.Selected">@item.Text </option>
        }
    </InputSelect>

and BackEnd

private async Task SetPriority(int priority)
    {
        int oldPriority = Beneficiary.EntryOrder;
        Clause clause = Policy.Clauses.FirstOrDefault(c => c.ClauseID == Beneficiary.ClauseID);
        Beneficiary.EntryOrder = priority;
    try
    {
        Beneficiary.EntryOrder = SetPriorityByOrdering(priority, oldPriority, clause);
        Beneficiary.UpdateEntryOrderList();

        if (!clause.Beneficiaries.Any(b => b.EntryOrder == oldPriority))
            clause.PrioritiesPercent.RemoveAll(p => p.Key == oldPriority);

    }
    catch (Exception ex)
    {
        string str = ex.Message;
    }

    StateHasChanged();
}

private int SetPriorityByOrdering(int priority, int oldPriority, Clause clause)
{
    List<int> clausePrioritiesList = clause.Beneficiaries.Select(p => p.EntryOrder).ToList();
    clausePrioritiesList.Remove(oldPriority); // remove changing priority

    List<int> distinctPriorities = clausePrioritiesList.Distinct().ToList();

    int nextPriority = distinctPriorities.Max() + 1;

    if (!distinctPriorities.Contains(priority) || priority != nextPriority)
    {
        distinctPriorities.Add(priority);
        distinctPriorities.Sort();

        priority = nextPriority;

        for (int item = 1; item <= distinctPriorities.Count; item++)
        {
            if (item != distinctPriorities[item - 1])
            {
                priority = item - 1; //NB!!!! If put hard-coded 1, priority = 1 - it will work nicely! Whats the ...
                break;
            }
        }
    }
    return priority;
}

0 Answers0