Listbox per MVC 6 EF 7 Proprietà non popolate

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

Domanda

Ho cercato per un po 'di tempo per ottenere una casella di riepilogo da compilare e non riesco a capirlo. Ho studiato la documentazione di entity framework 7 in modo abbastanza estensivo, ma ne sono ancora nuovo. Non ci sono molti tutorial per MVC6 / EF7, quindi è stato difficile sapere quale sia la migliore pratica per associare una classe di entità con un'istanza di un'altra. Per favore, scusa la lunghezza della domanda, sto solo cercando di essere esauriente.

Sto usando entity framework 7, asp.net 5 e MVC 6.

Passaggi per riprodurre il problema

  1. Creare una nuova applicazione Web ASP.Net â † 'Nome del progetto: ListBox.Web â †' Nome della soluzione ListBox
  2. Scegli Modelli APS.NET 5 â † ' Applicazione Web
  3. Crea due classi nella cartella Modelli

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

    Child.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. Crea controller e viste per ciascuna classe di dati usando lo scaffolding Controller per impalcature

  5. Aggiungi collegamenti ai controller in _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. Crea il database

    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. Esegui l'applicazione web

  8. Aggiungi un paio di genitori.

    inserisci la descrizione dell'immagine qui

  9. Tentativo di aggiungere un bambino.

    • Viene visualizzata una casella di rilascio per i genitori ma non ci sono elementi nella casella di selezione da selezionare
    • inserisci la descrizione dell'immagine qui
    • L'HTML per la casella di riepilogo è: <select class="form-control" data-val="true" data-val-required="The ParentId field is required." id="ParentId" name="ParentId"></select>

Codice sorgente del controller

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

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

Risposta accettata

Cambia il metodo Create() in ChildrenController , cambia

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

In Create.cshtml , cambia

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

Risposta popolare

Il codice generato non è corretto, è un bug https://github.com/aspnet/Scaffolding/issues/149

Una soluzione che utilizza "tag helper" è:

controllore

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

vista

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché