2012-05-17 13 views
5

Ich habe gerade angefangen MVC 4 zu machen und ich habe es ziemlich genossen, aber ich stehe in Schwierigkeiten, wenn ich es bin versuchen, meine Datenbank (nur NAME und EMAIL-Einträge) zu erhalten, um alle ihre Einträge in der Indexansicht anzuzeigen. Ich bekomme den folgenden Fehler:MVC - Wörterbuch benötigt ein Modell Item vom Typ 'System.Collections.Generic.IEnumerable`1

Ich konnte das Programm mit der Datenbank verbinden, aber ich bin hier ziemlich fest. Ich habe mich gefragt, ob ich Hilfe bekommen könnte. Hier ist mein Code:

Benutzerklasse

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

namespace MobileWebFormver2.Models 
{ 
    public class User 
    { 
     [Required(ErrorMessage="Please enter name.")] 
     public string Name { get; set; } 
     [Required(ErrorMessage="Please enter email.")] 
     public string Email { get; set; } 
    } 
} 

Homecontroller (WebForm1 ist ein Datenbank-Eintrag, die einen Namen und E-Mail-Feld enthält)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MobileWebFormver2.Models; 
using System.Data.Entity; 

namespace MobileWebFormver2.Controllers 
{ 
    public class HomeController : Controller 
    { 
     DataClasses1DataContext db = new DataClasses1DataContext(); 

     public ActionResult Index() 
     { 
      ViewBag.Message = "This is the TourEast Holidays Mobile Index"; 

      return View(db.WebForm1s.ToList()); 
     } 
    } 
} 

Index

@model IEnumerable<MobileWebFormver2.Models.User> 

@{ 
    ViewBag.Title = "Home Page"; 
} 

@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
     @Html.DisplayFor(modelItem => item.Name) 
     </td> 
     <td> 
     @Html.DisplayFor(modelItem => item.Email) 
     </td> 
    </tr> 
} 

EDIT: Dies bezieht sich auf DataClasses1DataContext. Ich bin mir nicht sicher, wie nützlich das sein wird.

DataClasses1.cs

namespace MobileWebFormver2.Models 
{ 
    partial class DataClasses1DataContext 
    { 
    } 
} 

DataClasses1.designer.cs

#pragma warning disable 1591 
//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:4.0.30319.269 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

namespace MobileWebFormver2.Models 
{ 
using System.Data.Linq; 
using System.Data.Linq.Mapping; 
using System.Data; 
using System.Collections.Generic; 
using System.Reflection; 
using System.Linq; 
using System.Linq.Expressions; 
using System.ComponentModel; 
using System; 


[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="MobileWebForm")] 
public partial class DataClasses1DataContext : System.Data.Linq.DataContext 
{ 

    private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource(); 

#region Extensibility Method Definitions 
partial void OnCreated(); 
partial void InsertWebForm1(WebForm1 instance); 
partial void UpdateWebForm1(WebForm1 instance); 
partial void DeleteWebForm1(WebForm1 instance); 
#endregion 

    public DataClasses1DataContext() : 
      base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MobileWebFormConnectionString"].ConnectionString, mappingSource) 
    { 
     OnCreated(); 
    } 

    public DataClasses1DataContext(string connection) : 
      base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

    public DataClasses1DataContext(System.Data.IDbConnection connection) : 
      base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

    public DataClasses1DataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
      base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

    public DataClasses1DataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
      base(connection, mappingSource) 
    { 
     OnCreated(); 
    } 

    public System.Data.Linq.Table<WebForm1> WebForm1s 
    { 
     get 
     { 
      return this.GetTable<WebForm1>(); 
     } 
    } 
} 

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.WebForm1")] 
public partial class WebForm1 : INotifyPropertyChanging, INotifyPropertyChanged 
{ 

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty); 

    private string _Name; 

    private string _Email; 

#region Extensibility Method Definitions 
partial void OnLoaded(); 
partial void OnValidate(System.Data.Linq.ChangeAction action); 
partial void OnCreated(); 
partial void OnNameChanging(string value); 
partial void OnNameChanged(); 
partial void OnEmailChanging(string value); 
partial void OnEmailChanged(); 
#endregion 

    public WebForm1() 
    { 
     OnCreated(); 
    } 

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Name", DbType="NVarChar(50) NOT NULL", CanBeNull=false, IsPrimaryKey=true)] 
    public string Name 
    { 
     get 
     { 
      return this._Name; 
     } 
     set 
     { 
      if ((this._Name != value)) 
      { 
       this.OnNameChanging(value); 
       this.SendPropertyChanging(); 
       this._Name = value; 
       this.SendPropertyChanged("Name"); 
       this.OnNameChanged(); 
      } 
     } 
    } 

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Email", DbType="NVarChar(50) NOT NULL", CanBeNull=false)] 
    public string Email 
    { 
     get 
     { 
      return this._Email; 
     } 
     set 
     { 
      if ((this._Email != value)) 
      { 
       this.OnEmailChanging(value); 
       this.SendPropertyChanging(); 
       this._Email = value; 
       this.SendPropertyChanged("Email"); 
       this.OnEmailChanged(); 
      } 
     } 
    } 

    public event PropertyChangingEventHandler PropertyChanging; 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void SendPropertyChanging() 
    { 
     if ((this.PropertyChanging != null)) 
     { 
      this.PropertyChanging(this, emptyChangingEventArgs); 
     } 
    } 

    protected virtual void SendPropertyChanged(String propertyName) 
    { 
     if ((this.PropertyChanged != null)) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
} 
#pragma warning restore 1591' 

schaute ich auf ähnliche Beiträge hier und ich weiß, dass es mit dem Führen eines Objekts zu tun hat, aber die Aussicht erwartet etwas anderes. Allerdings würde ich sagen, ich bin ein sehr Anfänger Level-Programmierer und ich glaube nicht, dass ich das meiste von dem verstand, was sie sagten. Ich habe im Grunde den Code von der MVC Tutorial-Seite (Link) von Microsoft auf, wie Sie Ihre Datenbank im Index zeigen, aber ich bekomme den Fehler. Jede Anleitung würde sehr geschätzt werden.

+0

Können Sie Ihre Implementierung von DbContext zeigen? Sie benötigen ein DbSet , um abzufragen. –

+0

Kannst du mir Anweisungen geben, wie man die Implementierung zeigt? Ich entschuldige mich, ich bin ein echter Anfänger, haha. Vielen Dank! –

+0

Ok, ich ging zu meinen Modellen und es gibt eine DataClasses1.dbml. Ich habe mit der rechten Maustaste darauf geklickt und den View-Code angeklickt und jetzt bin ich in DataClasses1.cs. im Code alles, was es ist: namespace MobileWebFormver2.Models { partielle Klasse DataClasses1DataContext { } } @LeonCullens –

Antwort

6

Das Problem ist, dass Sie die falsche Sache in die Ansicht übergeben. Sie übergeben eine Sammlung von WebForm1 's, nicht User' s.

Bearbeiten - Ihre Ansicht nach Modell Um dies ändern:

@model IEnumerable<MobileWebFormver2.Models.WebForm1> 

Bearbeiten - ein bisschen mehr Erklärung:

Auf dieser Linie, können Sie die Action schaffen und für das Modell in den Daten übergeben.

return View(db.WebForm1s.ToList()); 

Jedoch ist db.WebForm1s eine Sammlung von Typ WebForm1.

Ihrer Ansicht nach machen Sie eine stark typisierte Ansicht, wenn Sie das Modell erklären:

@model IEnumerable<MobileWebFormver2.Models.User> 

Die Ansicht, welche eine Sammlung von Benutzern erwartet, ist aber WebForm1 stattdessen übergeben. Daher der Fehler - Sie müssen entscheiden, welcher ist richtig, der Controller in WebForm1 übergeben, oder die Ansicht, und ändern Sie den anderen, um zu entsprechen.

+0

Unter der Annahme, dass DataClasses1DataContext einen DbSet genannt Nutzer natürlich enthält. –

+0

In der Tat nehme ich nur an, da er seinen Datenbankkontext nicht gezeigt hat, aber eine vernünftige Annahme schien. – Leniency

+0

könnte ich fragen, wie Sie DataClasses1DataContext erhalten DbSet ? Als ich versuchte, db.Users.ToList() hinzuzufügen, wurde es nicht kompiliert. Tut mir leid, wenn das eine dumme Frage ist, bin ich ziemlich neu in der Programmierung besonders objektorientiert. Ich schätze wirklich die Hilfe :) –

Verwandte Themen