Cuadro de lista para la propiedad MVC 6 EF 7 no se llena

asp.net-core-mvc asp.net-mvc-scaffolding entity-framework-core

Pregunta

He estado intentando durante un tiempo obtener un cuadro de lista para poblar y parece que no puedo resolverlo. He estudiado la documentación de Entity Framework 7 de forma bastante extensa, pero todavía soy nuevo en ello. No hay muchos tutoriales para MVC6 / EF7, por lo que es difícil saber cuál es la mejor práctica para asociar una clase de entidad con una instancia de otra. Por favor, disculpe la longitud de la pregunta, solo estoy tratando de ser cuidadoso.

Estoy usando Entity Framework 7, asp.net 5 y MVC 6.

Pasos para reproducir el problema

  1. Cree una nueva aplicación web ASP.Net â † 'Nombre del proyecto: ListBox.Web â †' Nombre de la solución ListBox
  2. Elija APS.NET 5 Plantillas â † ' Aplicación Web
  3. Crea dos clases en la carpeta de Modelos

    Parent.cs

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace ListBox.Web.Models
    {
        public class Parent
        {
            public int ParentId { get; set; }
            [Required]
            public string Name { get; set; }
            public ICollection<Child> Children { get; set; }
        }
    }
    

    Niño.cs

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace ListBox.Web.Models
    {
        public class Parent
        {
            public int ParentId { get; set; }
            [Required]
            public string Name { get; set; }
            public ICollection<Child> Children { get; set; }
        }
    }
    
  4. Cree controladores y vistas para cada una de las clases de datos mediante el uso de andamios. Controlador de andamios

  5. Agregue enlaces a los controladores en _Layout.cshtml

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace ListBox.Web.Models
    {
        public class Parent
        {
            public int ParentId { get; set; }
            [Required]
            public string Name { get; set; }
            public ICollection<Child> Children { get; set; }
        }
    }
    
  6. Crear la base de datos

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace ListBox.Web.Models
    {
        public class Parent
        {
            public int ParentId { get; set; }
            [Required]
            public string Name { get; set; }
            public ICollection<Child> Children { get; set; }
        }
    }
    
  7. Ejecutar la aplicación web.

  8. Añadir un par de padres.

    introduzca la descripción de la imagen aquí

  9. Intenta añadir un niño.

    • Se muestra un cuadro desplegable para los padres, pero no hay elementos en el cuadro desplegable para seleccionar
    • introduzca la descripción de la imagen aquí
    • El HTML para el cuadro de lista es: <select class="form-control" data-val="true" data-val-required="The ParentId field is required." id="ParentId" name="ParentId"></select>

Código fuente del controlador

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace ListBox.Web.Models
{
    public class Parent
    {
        public int ParentId { get; set; }
        [Required]
        public string Name { get; set; }
        public ICollection<Child> Children { get; set; }
    }
}

Child Create.cshtml

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace ListBox.Web.Models
{
    public class Parent
    {
        public int ParentId { get; set; }
        [Required]
        public string Name { get; set; }
        public ICollection<Child> Children { get; set; }
    }
}

Respuesta aceptada

Cambie el método Create() en ChildrenController , cambie

    public IActionResult Create()
    {
        ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent");
        return View();
    }

a

    public IActionResult Create()
    {
        ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent");
        return View();
    }

En Create.cshtml , cambiar

    public IActionResult Create()
    {
        ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent");
        return View();
    }

a

    public IActionResult Create()
    {
        ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent");
        return View();
    }

Respuesta popular

El código generado es incorrecto, es un error https://github.com/aspnet/Scaffolding/issues/149

Una solución que usa "ayudantes de etiquetas" es:

Controlador

...
ViewData["Parents"] = new SelectList(_context.Set<Parent>(), "ParentId", "Name", child.ParentId);
...

Ver

...
ViewData["Parents"] = new SelectList(_context.Set<Parent>(), "ParentId", "Name", child.ParentId);
...



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué