The model item passed into the dictionary is of type 'System.Data.Objects.ObjectQuery`1[System.String]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MvcProject1.Models.Indretning]'.
@janus_007: Han havde skam ret. String er en IEnumerable<char>, så det eneste problem var at han returnerede en IEnumerable<char>, og det er næppe det OP skal bruge.
@kongen72: Din View metode, hvad tager den imod, samt hvad gør den? For det som både janus og platik nævner henter det ud du skal bruge, men hvordan forsøger du at vise det?
Nu er jeg ikke nogen ørn til MVC, men læste lige lidt op på det.
Det du forsøger at gøre her, er at hente noget ud fra en klasse, allerede inden du giver klassen til dit view, og det er et problem, fordi din view klasse forventer at få en "MvcProject1.Models.Indretning" klasse, hvilket du også kan se på "Inherits" delen af dit view.
Tag istedet for at lave en tynd klasse som den her f.eks.
public class IndretningView{ public string Navn {get;set;} public char Forbogstav {get;set} }
Den kan du så i stedet bruge i dit view, ved at lave en inherits på den i stedet, for så vil din code behind komme til at se sådan her ud:
return db.Indretning.Select(e => new IndretningView{ Navn = e.Navn, Forbogstav = e.Navn.First() });
Får samme fejl som før: The model item passed into the dictionary is of type 'MvcProject1.ViewModels.IndretningViewModel', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MvcProject1.ViewModels.IndretningViewModel]'.
Sådan ser min kode ud nu:
view model
public class IndretningViewModel { public List<string> forbogstav { get; set; } }
controller public ViewResult Index() { var list = db.Indretning.Select(x => x.Navn.Substring(0,1));
var ViewModel = new ViewModels.IndretningViewModel { forbogstav = list.ToList() };
Ja, du er nød til at bruge view klassen (IndretningView) som den jeg skrev til dig. Om du vil bibeholde navn property'en eller ej, er så op til dig. Det er så denne du smider i View. Er som sagt ikke så skarp i MVC, men så må syntaxen så blive sådan her:
return View(db.Indretning.Select(e => new IndretningView{ Navn = e.Navn, Forbogstav = e.Navn.First() }));
Forudsat at din indretning indeholder en property / field navngivet Navn!
Det med Navn.First() vil ikke virke, da Navn ikke er en sekvens. Jeg ved ikke hvorfor johny bliver ved at påstå det?
forudsat: Avis Banan Kiwi
Så vil : return View(db.Indretning.Select(e => new IndretningView{ Navn = e.Navn, Forbogstav = e.Navn.First() }));
Du få en liste som ser ud på flg. måde: Avis, Avis Banan, Avis Kiwi, Avis
Og det er jo ikke det du vil!!
Årsagen til du får denne: The model item passed into the dictionary is of type 'System.Data.Objects.ObjectQuery`1[System.String]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MvcProject1.Models.Indretning]'.
Er fordi at return db.Indretning.Select(x => x.Navn.Substring(0,1));, netop returnerer en liste a strings (nøjagtigt som du bad om ;-)), men fejlen fortæller også tydeligt at den forventer en model af typen IEnumerable<Indretning>
Nummer 2 fejl du skriver: Får samme fejl som før: The model item passed into the dictionary is of type 'MvcProject1.ViewModels.IndretningViewModel', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[MvcProject1.ViewModels.IndretningViewModel]'.
Fortæller at du nu er mere på rigtigt spor, nu skal du bare have stadig have IEnumerable<Indretning>, istedet for IndretningViewModel.
Jeg anbefaler at du bare går tilbage til din Indretning, den er nemlig fin nok, der er ingen grund til at opfinde nye klasser. Så du skal bare returnere IEnumerable<Indretning>...
altså:
var list = db.Indretning.ToList(); return View(list);
Den siger også du kan nøjes med en IEnumerable, List implementerer IEnumerable, så ovenstående vil virke fint, men du kan altså også blot sige: return db.Indretning;
Anyway... Når det så er gjort og det at du vil have et bogstav er tydeligvis en præsentation og således intet med forretningslogik at gøre, så skal du gøre det direkte i dit view, altså:
Janus, tag nu lige at teste det selv så, eller slå det op? :)
"A string is a sequential collection of Unicode characters, typically used to represent text, while a String is a sequential collection of System.Char objects that represents a string."
Men ja, din løsning er umiddelbart pænere, selvom jeg godt kan lide view klasser da de er nemmere at styre. Og igen, det er sådan set korrekt den løsning jeg kommer med, jeg lægger bare styringen i code behind, af gammel vane, fordi det så er lettere at genbruge forretningslogik. Jeg har så ikke nogen anelse om hvordan koden skal bruges, og der fungerer det helt udmærket med dit eksempel. :)
Nope johny... du er galt på den ;-) First() gør præcis som jeg skriver.
Og jep... definitionen. "A string is a sequential collection of Unicode characters, typically used to represent text, while a String is a sequential collection of System.Char objects that represents a string."
Men men årsagen er... string implementerer bare ikke IEnumerable og derfor kan kan ikke behandles som du gerne vil :) dvs. linq extensionen findes ikke på string.
Jeg er 100% klar over hvad din tanke er med codebehind, men MVC kræver at vi ændrer vores opfattelse en anelse når det kommer til præsentation.
PS: Og genbrug af 1. bogstav hmm ;-) (ejj.. ved godt hvad du mener)
Hent evt. Linqpad og efterprøv, nu har vi snart brugt tid nok på denne diskussion.
Tak til johny for at have korrigeret mig mht. til om String implementerer IEnumerable, det gør den! Jeg ved ikke lige hvad jeg tænkte på da jeg skrev det hehe....
Anyway... den vil nu stadig kun give det første bogstav fra første element og der ønskes første bogstav fra hvert element.
Nu ved jeg ikke helt hvad det var for en løsning du forsøgte at nå frem til, men du kunne evt. prøve med den her, så tror jeg den opfylder alle kravene du har til det.
<% foreach (var item in Model.Select(e => e.Substring(0,1)).Distinct()) { %>
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.