none
Asp.Net MVC4 Hinzufügen mehrerer gespeicherter Objekte zu einem Objekt in einer View per Listbox

    Allgemeine Diskussion

  • Hallo

    ich habe folgende Entities in meinem Schema: Artikel & Foto (Auszug aus einen gesamten Schema)

    Zwischen Artikel & Foto existiert eine 1:n Beziehung wobei der foreign key in Foto nullable ist (Um allgemein auch Fotos speichern zu können - nicht notwendigerweise Artikelfotos)

    Die Fotos können auf einer extra View in die Datenbank gespeichert werden ohne dass sie einem Artikel zugeordnet sind.

    Wenn ich also jetzt einen Artikel speichern möchte, möchte ich auf einer Create View zB eine Listbox haben wo ich alle gespeicherten Fotos aufgelistet habe. Von der Listbox möchte ich mehrere Fotos selektieren können, die zu diesem Artikel zugeordnet werden beim Speichern.

    Mein Artikel Model sieht folgendermaßen aus:

        public class Artikel
        {
            [Key]
            public long ArtikelID { get; set; }
            public string Beschreibung { get; set; }
            [Required]
            public double Preis { get; set; }
            [Required]
            public int Stueck { get; set; }
    
            public string Artikeltyp { get; set; }
            public bool Verfuegbar { get; set; }
    
            public virtual Ersatzteile Ersatzteil { get; set; }
            public virtual Felgen Felgen { get; set; }
            public virtual Fahrzeug Fahrzeug { get; set; }
            public virtual Sonstiges Sonstiges { get; set; }
            public virtual Reifen Reifen { get; set; }
            public virtual ICollection<Foto> Fotos { get; set; }
    }

    Hier das Foto Model:

        public class Foto
        {
            [Key]
            public long FotoID { get; set; }
            public string Fototyp { get; set; }
            public DateTime Uploaddatum { get; set; }
            public double SizeKB { get; set; }
            public string Pfad800X600 { get; set; }
            public string PfadThumbnail { get; set; }
            public string PfadMedium { get; set; }
            public string Name { get; set; }
            public string Beschreibung { get; set; }
            public string ImageUrl { get; set; }
            [Display(Name="Als Artikelfoto markieren?", Description="Nur Artikelfotos können beim hinzufügen eines neuen Artikels ausgewählt werden.")]
            public bool IstArtikelFoto { get; set; }
    
            public virtual Artikel Artikel { get; set; }
            public virtual News News { get; set; }
            public virtual Mitarbeiter Mitarbeiter { get; set; }
    
    
            [NotMapped]
            [DataType(DataType.Upload)]
            //[FileExtensions(Extensions=(".jpg",".jpeg",".png"),ErrorMessage="Datei hat ein falsches Format. (Erforderlich: jpg, jpeg, png")]
            public HttpPostedFileBase FotoContent { get; set; }
    
            [NotMapped]
            public bool Delete { get; set; }
        }

    und hier die diversen Constraints:

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
                try
                {
                    modelBuilder.Entity<Fahrzeug>().Property(f => f.Baujahr).HasColumnType("datetime2").HasPrecision(0);
                    modelBuilder.Entity<News>().Property(f => f.Erstelldatum).HasColumnType("datetime2").HasPrecision(0);
                    modelBuilder.Entity<Foto>().Property(f => f.Uploaddatum).HasColumnType("datetime2").HasPrecision(0);
    
                    modelBuilder.Entity<Marke>().HasMany(j => j.Modelle).WithRequired(m => m.Marke).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Modell>().HasMany(j => j.Artikeln).WithRequired(m => m.Modell).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Artikel>().HasMany(j => j.Fotos).WithOptional(m => m.Artikel).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Ersatzteile>().HasRequired(j => j.Artikel).WithOptional(m => m.Ersatzteil).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Fahrzeug>().HasRequired(j => j.Artikel).WithOptional(m => m.Fahrzeug).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Felgen>().HasRequired(j => j.Artikel).WithOptional(m => m.Felgen).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Reifen>().HasRequired(j => j.Artikel).WithOptional(m => m.Reifen).WillCascadeOnDelete(true);
                    modelBuilder.Entity<Sonstiges>().HasRequired(j => j.Artikel).WithOptional(m => m.Sonstiges).WillCascadeOnDelete(true);
    
                    base.OnModelCreating(modelBuilder);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

    Ich habe eine strongly typed view (Artikel) zum Erstellen eines Artikels:

    dieser View übergebe ich folgende Daten:

     var fotos = db.Fotos.Where(m => m.IstArtikelFoto == true).Select(m => m).ToList();
                ViewData["Fotos"] = new SelectList(fotos, "FotoID", "Name");

    und in der View hab ich folgendes versucht:

    @Html.ListBoxFor( m => m.Fotos, new MultiSelectList(ViewData["Fotos"] as SelectList, "FotoID", "Name"))

    aber nachdem ich das formular gepostet habe, habe ich die ausgewählten Fotos

    nicht bekommen. Immer nur 0 Fotos.

    Im gerenderten HTML-Code hab ich bei den Options als value die FotoID und als text den Fotonamen.

    Ich hoffe ich habe mein Problem verständlich erklärt :)

    Irgendwelche Ideen wie ich das Problem am besten lösen soll?

    lg Michael

    • Typ geändert Stefan FalzMVP, Moderator Samstag, 31. August 2013 18:05 Thread ohne wirkliche Lösung abgeschlossen, daher Umwandlung in eine allgemeine Diskussion
    Dienstag, 29. Januar 2013 13:37

Alle Antworten

  • Hi,

    wenn du in der Box die Bilder auswählst, kannst du dann garantieren das die Option-Elemente in der Listbox "selected" sind? Kannst du mit firebug mal schauen was genau beim Absenden des Formulars zurueckgeposted wird an den Server? Es sollten dann ja alle Value-Werte der selektierten Options sein.

    Wie sieht dein Controller aus der die abgesendeten Formulardaten empfängt? Also wie holst du die Formularinformationen aus dem Datenstrom (POST/GET, Methodenparameter).

    Donnerstag, 13. Juni 2013 07:24