I just started doing MVC 4 and I've been enjoying it quite a bit, but I'm running into trouble when I'm trying to get my database (just NAME and EMAIL entries) to show all its entries in the index view. I get the following error:
The model item passed into the dictionary is of type 'System.Collections.Generic.List
1[MobileWebFormver2.Models.WebForm1]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable
1[MobileWebFormver2.Models.User]'.
I was able to connect the program to the database, but I'm pretty much stuck here. I was wondering if I could get some help. Here's my code:
User Class
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 is a database entry, that contains a NAME and EMAIL field)
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: This refers to DataClasses1DataContext. I'm not sure how useful this will be.
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'
I looked at similar posts here and I know it has to do with passing an object, but the view is expecting something else. However I would say I'm a very beginner level programmer and I don't think I understood most of what they were saying. I basically followed the code from the MVC tutorial site (Link) from Microsoft on how to show your database in the index, but I'm getting the error. Any guidance would be greatly appreciated.
The problem is that you're passing the wrong thing into the view. You're passing a collection of WebForm1
's, not User
's.
Edit - Change your view model to this:
@model IEnumerable<MobileWebFormver2.Models.WebForm1>
Edit - a bit more explanation:
On this line, you are creating the ActionResult and passing in the data for the model.
return View(db.WebForm1s.ToList());
However, db.WebForm1s is a collection of type WebForm1
.
In your view, you are making a strongly typed view when you declare the model:
@model IEnumerable<MobileWebFormver2.Models.User>
The view expects a collection of users, but is passed WebForm1 instead. Hence the error - you have to decide which one is correct, the controller passing in WebForm1, or the view, and change the other to match.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With