Preciso de ajuda com o auxiliar de seleção de tags no ASP.NET Core.
Eu tenho uma lista de funcionários que estou tentando vincular a um auxiliar de seleção de tags. Meus funcionários estão em um List<Employee> EmployeesList
valor selecionado e entrarão em EmployeeId
propriedade. Meu modelo de exibição fica assim:
public class MyViewModel
{
public int EmployeeId { get; set; }
public string Comments { get; set; }
public List<Employee> EmployeesList {get; set; }
}
Minha classe de funcionários fica assim:
public class Employee
{
public int Id { get; set; }
public string FullName { get; set; }
}
Minha pergunta é como digo ao meu ajudante de tag select para usar Id
como valor enquanto é exibido FullName
na lista suspensa?
<select asp-for="EmployeeId" asp-items="???" />
Eu apreciaria alguma ajuda com isso. Obrigado.
Respostas:
Usando os auxiliares Select Tag para renderizar um elemento SELECT
Na sua ação GET, crie um objeto do seu modelo de visualização, carregue a
EmployeeList
propriedade de coleção e envie-a para a visualização.E, na sua exibição de criação, crie um novo
SelectList
objeto a partir daEmployeeList
propriedade e passe-o como valor para aasp-items
propriedade.E seu método de ação HttpPost para aceitar os dados do formulário enviado.
Ou
Se o seu modelo de visualização tiver uma
List<SelectListItem>
propriedade como para seus itens suspensos.E na sua ação,
E, na visualização, você pode usar diretamente a
Employees
propriedade para oasp-items
.A classe
SelectListItem
pertence aoMicrosoft.AspNet.Mvc.Rendering
espaço para nome.Verifique se você está usando uma tag de fechamento explícita para o elemento select. Se você usar a abordagem de fechamento automático, o auxiliar de renderização renderizará um elemento SELECT vazio!
A abordagem abaixo não funcionará
Mas isso vai funcionar.
Obtendo dados da tabela do banco de dados usando a estrutura da entidade
Os exemplos acima estão usando itens codificados para as opções. Então, pensei em adicionar um código de exemplo para obter dados usando o Entity Framework, pois muitas pessoas o usam.
Vamos supor que seu objeto DbContext tenha uma propriedade chamada
Employees
, que é do tipo emDbSet<Employee>
que aEmployee
classe de entidade possui uma propriedadeId
eName
como estaVocê pode usar uma consulta LINQ para obter os funcionários e usar o método Select na sua expressão LINQ para criar uma lista de
SelectListItem
objetos para cada funcionário.Assumindo que
context
é seu objeto de contexto db. O código de exibição é o mesmo que acima.Usando SelectList
Algumas pessoas preferem usar a
SelectList
classe para armazenar os itens necessários para renderizar as opções.Agora, na sua ação GET, você pode usar o
SelectList
construtor para preencher aEmployees
propriedade do modelo de exibição. Verifique se você está especificando os parâmetrosdataValueField
edataTextField
.Aqui eu estou chamando o
GetEmployees
método para obter uma lista de objetos Employee, cada um com umaId
eFirstName
propriedade e eu usar essas propriedades comoDataValueField
eDataTextField
doSelectList
objeto que criamos. Você pode alterar a lista codificada para um código que lê dados de uma tabela de banco de dados.O código da visualização será o mesmo.
Renderize um elemento SELECT a partir de uma lista de cadeias.
Às vezes, você pode querer renderizar um elemento de seleção de uma lista de cadeias. Nesse caso, você pode usar o
SelectList
construtor que leva apenasIEnumerable<T>
O código da visualização será o mesmo.
Definir opções selecionadas
Algumas vezes, convém definir uma opção como a opção padrão no elemento SELECT (por exemplo, em uma tela de edição, você deseja carregar o valor da opção salva anteriormente). Para fazer isso, você pode simplesmente definir o
EmployeeId
valor da propriedade para o valor da opção que deseja ser selecionada.Isso selecionará a opção Tom no elemento de seleção quando a página for renderizada.
Menu suspenso de seleção múltipla
Se você deseja renderizar uma lista suspensa de seleção múltipla, pode simplesmente alterar a propriedade do modelo de visualização que você usa para
asp-for
atribuir na visualização a um tipo de matriz.Isso renderizará a marcação HTML para o elemento select com o
multiple
atributo que permitirá ao usuário selecionar várias opções.Definir opções selecionadas na seleção múltipla
Semelhante à seleção única, defina o
EmployeeIds
valor da propriedade para uma matriz de valores que você deseja.Isso selecionará a opção Tom e Jerry no elemento de seleção múltipla quando a página for renderizada.
Usando o ViewBag para transferir a lista de itens
Se você não prefere manter uma propriedade tipo de coleção para passar a lista de opções para a vista, você pode usar o ViewBag dinâmica para fazê-lo. ( Esta não é a minha abordagem recomendada, pessoalmente, como viewbag é dinâmico e seu código é propenso a uncatched erros de digitação )
e na vista
Usando o ViewBag para transferir a lista de itens e definir a opção selecionada
É o mesmo que acima. Tudo o que você precisa fazer é definir o valor da propriedade (para a qual você está vinculando a lista suspensa) com o valor da opção que você deseja selecionar.
e na vista
Agrupando itens
O método auxiliar de seleção de tags suporta opções de agrupamento em uma lista suspensa. Tudo o que você precisa fazer é especificar o
Group
valor da propriedade de cada umSelectListItem
no seu método de ação.Não há alterações no código da visualização. o auxiliar de seleção de tags agora renderizará as opções em dois itens do grupo de opções.
fonte
<option>Please select one</option>
Eu criei uma interface e um
<options>
auxiliar de tag para isso. Portanto, não tive que converter osIEnumerable<T>
itens emIEnumerable<SelectListItem>
todas as vezes que preciso preencher o<select>
controle.E acho que funciona lindamente ...
O uso é algo como:
E para fazê-lo funcionar com o auxiliar de tag, você precisa implementar essa interface em sua classe:
Estes são os códigos necessários:
A interface:
O
<options>
auxiliar de tag:Pode haver algum erro de digitação, mas o objetivo é claro, eu acho. Eu tive que editar um pouco.
fonte
Você também pode usar IHtmlHelper.GetEnumSelectList.
fonte
Minha resposta abaixo não resolve a questão, mas está relacionada a.
Se alguém estiver usando, em
enum
vez de um modelo de classe, como este exemplo:E uma propriedade para obter o valor ao enviar:
Na página de navalha, você pode usar
Html.GetEnumSelectList<Counter>()
para obter as propriedades da enumeração.Ele gera o seguinte HTML:
fonte
Você pode usar o código abaixo para seleção múltipla :
Você também pode usar:
fonte
Em Get:
Na postagem:
Em vista :
fonte