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