Я реализую функцию автозаполнения, используя MudAutocomplete. Это прекрасно работает, если я просто хочу связать одно значение поиска со значением модели в моей форме редактирования. Однако я не могу понять, как заполнить два значения. Автозаполнение выполняет поиск в списке агентств и помещает название агентства в свойство имени агентства формы, но мне также нужно заполнить скрытое поле AgencyIdentifier. Вот упрощенный образец моей формы редактирования, показывающий только автозаполнение (на самом деле в форме гораздо больше полей ввода, это только для демонстрационных целей).
<EditForm Model = "@ApplicationUser" OnValidSubmit = "OnValidSubmit">
<DataAnnotationsValidator />
<MudDialog Style = "width:550px;height:650px;">
<DialogContent>
<MudGrid>
<MudItem xs = "12">
<MudCard>
<MudCardContent>
<MudStack Row = "true">
<MudStack Row = "true">
<MudAutocomplete Label = "Agency" @bind-Value = "@ApplicationUser.AgencyName" Required = "true"
SearchFunc = "@AgenciesAsync" Immediate = "true" ResetValueOnEmptyText = "true"
AdornmentIcon = "@MudBlazor.Icons.Material.Filled.Search" AdornmentColor = "MudBlazor.Color.Primary"
For = "@(() => ApplicationUser.AgencyName)" />
</MudStack>
</MudStack>
</MudCardContent>
<MudCardActions>
<div Class = "pr-2">
<MudButton Variant = "Variant.Filled" StartIcon = "@MudBlazor.Icons.Material.Filled.Cancel" Color = "MudBlazor.Color.Error" Size = "MudBlazor.Size.Small" OnClick = "Cancel" ButtonType = "MudBlazor.ButtonType.Button">Cancel</MudButton>
</div>
<div Class = "pr-2">
<MudButton Variant = "Variant.Filled" StartIcon = "@MudBlazor.Icons.Material.Filled.Save" Color = "MudBlazor.Color.Success" Size = "MudBlazor.Size.Small" ButtonType = "MudBlazor.ButtonType.Submit">Save</MudButton>
</div>
</MudCardActions>
</MudCard>
</MudItem>
</MudGrid>
</DialogContent>
</MudDialog>
</EditForm>
вот код, активируемый при отправке действительной формы
private async Task OnValidSubmit(EditContext context)
{
if (context.Validate())
{
var agencyDTO = Mapper.Map<UserEditViewModel, ApplicationUser>(ApplicationUser);
//update & save code goes here
await InvokeAsync(() => MudDialog.Close(DialogResult.Ok(context)));
}
}
а это функция поиска агентства
private async Task<IEnumerable<string?>> AgenciesAsync(string value)
{
var empty = Enumerable.Empty<string>();
if (!String.IsNullOrEmpty(value) && value.Length > 0)
{
var agencies = await AgencyService.AgencyAutocompleteLookupAsync(value.Trim());
var result = agencies.Select(x => x.AgencyName);
return result;
}
else
{
return empty;
}
}
Я пытаюсь реализовать функцию поиска, которая возвращает объект, содержащий AgencyName и AgencyIdentifier.
Я попытался создать простую модель представления и вернуть ее из функции поиска следующим образом.
public class AgencyLookupViewModel
{
public Guid AgencyIdentifier { get; set; }
public string AgencyName { get; set; } = string.Empty;
}
Затем я изменил поиск
private async Task<IEnumerable<AgencyLookupViewModel?>> AgenciesAsync(string value)
{
var empty = Enumerable.Empty<AgencyLookupViewModel>();
if (!String.IsNullOrEmpty(value) && value.Length > 0)
{
var agencies = await AgencyService.AgencyAutocompleteLookupAsync(value.Trim());
var result = Mapper.Map <IEnumerable<AgencyDto>,IEnumerable<AgencyLookupViewModel>>(agencies);
return result;
}
else
{
return empty;
}
}
Я просто не могу понять, как заставить это работать с MudAutocomplete, чтобы я мог заполнить как формы AgencyName, так и скрытые формы AgencyIdentifier. Кто-нибудь может помочь?
Если ваш SearchFunc
использует объект, компонент MudAutoComplete
должен знать, что это за объект. Вы делаете это, указывая свойство T
объекта MudAutoComplete
. Вот пример.
<MudAutocomplete T = "Element"
@bind-Value = "value"
SearchFunc = "@Search"
ToStringFunc = "@(e=> e==null?null : $"{e.Name} ({e.Sign})")"/>
Это показывает, что MudAutoComplete
привязан к объекту Element
. ToStringFunc
используется для отображения того, что вы хотите. В вашем случае это будет Name
(в примере используются имя и знак).
Значение привязки — это переменная Element
, которая устанавливается в соответствии с выбором пользователя. Это означает, что как только пользователь сделает выбор, вы получите доступ ко всему выбранному Element
через привязку value
. Это означает, что теперь вы можете получить AgencyIdentifier
или любое другое общедоступное свойство, доступное для объекта (в примере извлекается элемент Number
).
удалось заставить это работать, но как мне выполнить проверку в этом сценарии? Мне нужны и идентификатор, и имя.