Benutzer mit den meisten Antworten
Übergabe eines Abfrageergebnisses an eine View / Listbox

Frage
-
Hallo,
ich habe eine Abfrage im Controller, welche mir eine Datenmenge aus einer Sql-Server-Tabelle für eine Listbox aufbereiten soll. Das sieht im Moment so aus:
// GET: Sales public ActionResult Index() { var data = db.Fahrzeuge.Where(m => m.Marke.StartsWith("K")) .GroupBy( m => new { Marke= m.Marke, Model= m.kmStand } ) .Select( grp => new { Marke= grp.Key.Marke, Model= grp.Key.kmStand } ).ToList(); return View(); }
Ziel soll es sein, dieses Abfrageergebnis in der View für eine Listbox zu verwenden. In der View sollen dann weiterhin die km-Stände der markierten Einträge addiert werden.
Funktioniert die Übergabe an die View auch mit ViewBags? Bei der Model Variante kann ich ja immer nur ein Model an die View geben, was aber, wenn ich verschiedene Datenmengen z.B. für mehrere Listboxen verarbeiten und darstellen möchte?
Wie muss ich denn da vorgehen?
.::datekk::.
- Bearbeitet datekk2 Samstag, 21. September 2019 12:23
Antworten
-
Woher soll den der Compiler wissen wie die Daten zu konvertieren sind. In diesem einfachen fall ist es jedem beteiligten Menschen einleuchtend was zu tun ist. Der Compiler ist aber dumm.
Das habe ich dir oben schon geschrieben
public class AutoList { public string Marke { get; set; } public int kmStand { get; set; } } void Test() { List<string> auto = new List<string>() { "Ka", "Kb", "Kc" }; var data = auto.Where(a => a.StartsWith("k")).Select(a => new AutoList() { Marke = a }).ToList(); }
Das Ergebnis ist eine List<AutoList>Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings- Als Antwort markiert datekk2 Dienstag, 1. Oktober 2019 15:36
Alle Antworten
-
Hallo,
erstelle doch einfach ein ViewModel in dem Du dann die anderen Models packst.
public class Model1 { public string Foo { get; set; } } public class Model2 { public string Bar { get; set; } } public class ViewModel1 { public Model1 Model1 { get; set; } public Model2 Model2 { get; set; } }
Ein ViewModel existiert nur für die View und wird nie in eine Datenbank geschrieben. Das ist bei MVC auch so üblich.
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
Um bei meinem o.g. Beispiel zu bleiben....
Ich erstelle eine Klasse
public class AutoListe { public string Marke { get; set; } public int kmStand{ get; set; } public bool? IsSelected { get; set; } }
Wie konvertiere ich nun 'var data' in eine neue Klasse? Mit:
List<AutoListe> autoliste = new List<Autoliste>(); autoliste = data;
bekomme ich immer Fehlermeldungen das das Eine nicht zum Anderen konvertiert werden kann.
Was mache ich falsch?
.::datekk::.
- Bearbeitet datekk2 Dienstag, 1. Oktober 2019 13:31
-
Ich verstehe dein Problem nicht.
Übergebe doch einfach deine liste an die View mit View(data). in der View gibst Du dann @model IEnumerable<namespace.Autoliste> an
public class AutoList { public string Marke { get; set; } public int kmStand { get; set; } } void Test() { List<string> auto = new List<string>() { "Ka", "Kb", "Kc" }; var data = auto.Where(a => a.StartsWith("K")).Select(a => new AutoList() { Marke = a }).ToList(); }
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings
- Bearbeitet Thomas Wycichowski Dienstag, 1. Oktober 2019 14:33
-
Das geht ja nicht.. Autoliste ist ja nicht mit data kompatibel. Daher wollte ich ja die Daten aus 'data' in das Objekt Autoliste konvertieren...
Auch geht es mir grundsätzlich um das Thema Konvertierung. Warum kann ich das eine Objekt nicht an das andere übergeben? Oder geht es nur über eine Foreach Schleife in dem Element für Element übergeben wird?
In meiner Blazor App habe ich ebenfalls die Konvertierung versucht hier die Fehlermeldung:
Der Typ "System.Collections.Generic.List<<anonymous type: int? string Marke, int? kmStand, bool IsSelected>>" kann nicht implizit in "System.Collections.Generic.List<BlazorApp2.Data.AutoListe>" konvertiert werden.
Warum geht das nicht?
.::datekk::.
-
Automatisch geht das natürlich nicht. Es gibt viele Wege um einen Objekt in ein anders zu überführen schau dir dazu die Doku an Boxing und Unboxing Umwandlung und Typkonvertierungen
Wenn man eine Liste von Objekten hat, dann geht es nur über eine Schleife.
Du solltest dir für alle Objekte eigene Klassen erstellen und nicht mit anonymen Objekten arbeiten
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
In MVC ist es auch nicht üblich das der Controller entscheidet was die View anzeigen soll. Im Normalfall wird der ganze Model an die View übergeben (Fahrzeuge) erst die View entscheidet dann das sie nur Marke und KmStand anzeigt.
Es gibt natürlich ausnahmen von der Regel. Z.B. bei dem UserModel wo Passwörter hinterlegt sind. Dazu erstellt man sich dann ein ViewModel und übergibt dieses an die View.
Bei MVC ist die View immer X. Sie könnte auch eine Desktop App sein. Demnach könnte es sinnvoll sein nur einen Teil der Daten zu übergeben um weniger Traffic zu erzeugen. Das macht natürlich wiederum wenig sinn wenn die View an anderer stellen die anderen Daten aus dem Model anzeigt.
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
Ja, genau das will ich ja auch tun.. Daher habe ich ja auch die Klasse erstellt. Kannst Du mir zeigen, wie ich in dem genannten Beispiel mit der erstellten Klasse arbeiten kann?
denn auch
List<AutoListe> autoliste = new Liste<Autoliste>();
autoliste = (AutoListe)db.Fahrzeuge... (weiter siehe erster Post).ToList();
Bringt den gleichen Fehler...
.::datekk::.
-
Woher soll den der Compiler wissen wie die Daten zu konvertieren sind. In diesem einfachen fall ist es jedem beteiligten Menschen einleuchtend was zu tun ist. Der Compiler ist aber dumm.
Das habe ich dir oben schon geschrieben
public class AutoList { public string Marke { get; set; } public int kmStand { get; set; } } void Test() { List<string> auto = new List<string>() { "Ka", "Kb", "Kc" }; var data = auto.Where(a => a.StartsWith("k")).Select(a => new AutoList() { Marke = a }).ToList(); }
Das Ergebnis ist eine List<AutoList>Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings- Als Antwort markiert datekk2 Dienstag, 1. Oktober 2019 15:36
-
Warum das automatisch passiert weiß ich nicht.
Man sollte Code immer in einem Code Block einfügen. Dafür kannst Du auf das Icon oben rechts neben dem Bildicon nutzen
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings