Necesito ayuda con el asistente de selección de etiquetas en ASP.NET Core.
Tengo una lista de empleados que estoy tratando de vincular a un asistente de etiqueta de selección. Mis empleados están en un List<Employee> EmployeesList
valor seleccionado y entrarán en EmployeeId
propiedad. Mi modelo de vista se ve así:
public class MyViewModel
{
public int EmployeeId { get; set; }
public string Comments { get; set; }
public List<Employee> EmployeesList {get; set; }
}
Mi clase de empleado se ve así:
public class Employee
{
public int Id { get; set; }
public string FullName { get; set; }
}
Mi pregunta es ¿cómo le digo a mi ayudante de etiqueta select que use Id
como valor mientras se muestra FullName
en la lista desplegable?
<select asp-for="EmployeeId" asp-items="???" />
Agradecería un poco de ayuda con esto. Gracias.
Respuestas:
Uso de los ayudantes Seleccionar etiqueta para representar un elemento SELECCIONAR
En su acción GET, cree un objeto de su modelo de vista, cargue la
EmployeeList
propiedad de colección y envíela a la vista.Y en su vista de creación, cree un nuevo
SelectList
objeto desde laEmployeeList
propiedad y páselo como valor para laasp-items
propiedad.Y su método de acción HttpPost para aceptar los datos del formulario enviado.
O
Si su modelo de vista tiene una
List<SelectListItem>
propiedad de sus elementos desplegables.Y en tu acción,
Y en la vista, puede usar directamente la
Employees
propiedad paraasp-items
.La clase
SelectListItem
pertenece alMicrosoft.AspNet.Mvc.Rendering
espacio de nombres.Asegúrese de estar utilizando una etiqueta de cierre explícita para el elemento seleccionado. Si utiliza el enfoque de etiqueta de cierre automático, el asistente de etiqueta generará un elemento SELECT vacío.
El siguiente enfoque no funcionará
Pero esto funcionará.
Obtener datos de su tabla de base de datos utilizando el marco de la entidad
Los ejemplos anteriores están utilizando elementos codificados para las opciones. Entonces pensé que agregaría un código de muestra para obtener datos usando Entity Framework ya que mucha gente lo usa.
Supongamos que su objeto DbContext tiene una propiedad llamada
Employees
, que es de tipoDbSet<Employee>
donde laEmployee
clase de entidad tiene una propiedadId
yName
asíPuede usar una consulta LINQ para obtener los empleados y usar el método Select en su expresión LINQ para crear una lista de
SelectListItem
objetos para cada empleado.Asumiendo que
context
es su objeto de contexto db. El código de vista es el mismo que el anterior.Usando SelectList
Algunas personas prefieren usar la
SelectList
clase para guardar los elementos necesarios para representar las opciones.Ahora en su acción GET, puede usar el
SelectList
constructor para completar laEmployees
propiedad del modelo de vista. Asegúrese de especificar los parámetrosdataValueField
ydataTextField
.Aquí estoy llamando el
GetEmployees
método para obtener una lista de objetos a los empleados, cada uno con unaId
y laFirstName
propiedad y uso esas propiedades comoDataValueField
yDataTextField
delSelectList
objeto que hemos creado. Puede cambiar la lista codificada a un código que lee datos de una tabla de base de datos.El código de vista será el mismo.
Renderiza un elemento SELECT de una lista de cadenas.
A veces es posible que desee representar un elemento seleccionado de una lista de cadenas. En ese caso, puede usar el
SelectList
constructor que solo tomaIEnumerable<T>
El código de vista será el mismo.
Establecer opciones seleccionadas
Algunas veces, es posible que desee establecer una opción como la opción predeterminada en el elemento SELECCIONAR (por ejemplo, en una pantalla de edición, desea cargar el valor de la opción guardada anteriormente). Para hacer eso, simplemente puede establecer el
EmployeeId
valor de la propiedad en el valor de la opción que desea seleccionar.Esto seleccionará la opción Tom en el elemento select cuando se renderice la página.
Menú desplegable de selección múltiple
Si desea representar un menú desplegable de selección múltiple, simplemente puede cambiar la propiedad del modelo de vista que usa para el
asp-for
atributo en su vista a un tipo de matriz.Esto generará el marcado HTML para el elemento select con el
multiple
atributo que permitirá al usuario seleccionar múltiples opciones.Configuración de opciones seleccionadas en selección múltiple
Similar a la selección única, establezca el
EmployeeIds
valor de la propiedad en la matriz de valores que desee.Esto seleccionará la opción Tom y Jerry en el elemento de selección múltiple cuando se renderice la página.
Usando ViewBag para transferir la lista de elementos
Si no prefiere mantener una propiedad de tipo de colección para pasar la lista de opciones a la vista, puede usar la ViewBag dinámica para hacerlo. ( Este no es mi enfoque recomendado personalmente ya que viewbag es dinámico y su código es propenso a no ser detectado errores tipográficos )
y en la vista
Usar ViewBag para transferir la lista de elementos y configurar la opción seleccionada
Es igual que el anterior. Todo lo que tiene que hacer es establecer el valor de la propiedad (para la cual está vinculando el menú desplegable) al valor de la opción que desea seleccionar.
y en la vista
Agrupación de artículos
El método de ayuda de la etiqueta select admite opciones de agrupación en un menú desplegable. Todo lo que tiene que hacer es especificar el
Group
valor de propiedad de cada unoSelectListItem
en su método de acción.No hay cambio en el código de vista. el asistente de selección de etiquetas ahora mostrará las opciones dentro de 2 elementos de optgroup .
fuente
<option>Please select one</option>
Creé una interfaz y un
<options>
ayudante de etiqueta para esto. Así que no tuve que convertir losIEnumerable<T>
elementosIEnumerable<SelectListItem>
cada vez que tenía que llenar el<select>
control.Y creo que funciona muy bien ...
El uso es algo como:
Y para que funcione con la etiqueta de ayuda, debe implementar esa interfaz en su clase:
Estos son los códigos necesarios:
La interfaz:
El
<options>
ayudante de etiqueta:Puede haber algún error tipográfico, pero creo que el objetivo es claro. Tuve que editar un poco.
fuente
También puede usar IHtmlHelper.GetEnumSelectList.
fuente
Mi respuesta a continuación no resuelve la pregunta, pero está relacionada .
Si alguien está usando en
enum
lugar de un modelo de clase, como este ejemplo:Y una propiedad para obtener el valor al enviar:
En la página de la maquinilla de afeitar, puede usar
Html.GetEnumSelectList<Counter>()
para obtener las propiedades de enumeración.Genera el siguiente HTML:
fuente
Puede usar el siguiente código para selección múltiple :
También puedes usar:
fuente
En Get:
En Post:
En vista :
fuente