【问题标题】:MVC - Dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1MVC - 字典需要“System.Collections.Generic.IEnumerable”类型的模型项1
【发布时间】:2012-05-17 00:52:29
【问题描述】:

我刚开始做 MVC 4 并且一直很喜欢它,但是当我试图让我的数据库(只是 NAME 和 EMAIL 条目)在索引视图。我收到以下错误:

传入字典的模型项的类型为“System.Collections.Generic.List1[MobileWebFormver2.Models.WebForm1]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1[MobileWebFormver2.Models.User]”

我能够将程序连接到数据库,但我几乎被困在这里。我想知道我是否可以得到一些帮助。这是我的代码:

用户类

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 是一个数据库条目,包含一个 NAME 和 EMAIL 字段)

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());
        }
    }
}

索引

@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>
}

编辑:这是指 DataClasses1DataContext。我不确定这会有多大用处。

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'

我在这里查看了类似的帖子,我知道这与传递对象有关,但视图期待其他内容。但是我会说我是一个非常初级的程序员,我认为我不理解他们所说的大部分内容。我基本上遵循了来自 Microsoft 的 MVC 教程站点 (Link) 中关于如何在索引中显示您的数据库的代码,但我遇到了错误。任何指导将不胜感激。

【问题讨论】:

  • 你能展示你的 DbContext 实现吗?你需要一个 DbSet 来查询。
  • 你能给我提供关于如何展示实施的说明吗?对不起,我是一个真正的初学者哈哈。谢谢!
  • 好的,我去了我的模型,有一个 DataClasses1.dbml。我右键单击它并单击查看代码,现在我在 DataClasses1.cs 中。在代码中只有:命名空间 MobileWebFormver2.Models { partial class DataClasses1DataContext { } } @LeonCullens

标签: asp.net-mvc razor


【解决方案1】:

问题是您将错误的内容传递到视图中。您正在传递 WebForm1 的集合,而不是 User 的集合。

编辑 - 将您的视图模型更改为:

@model IEnumerable<MobileWebFormver2.Models.WebForm1>

编辑 - 更多解释:

在这一行中,您正在创建 ActionResult 并为模型传递数据。

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

但是,db.WebForm1s 是 WebForm1 类型的集合。

在您看来,当您声明模型时,您正在创建一个强类型视图:

@model IEnumerable<MobileWebFormver2.Models.User>

视图需要一个用户集合,但改为传递 WebForm1。因此出现错误 - 您必须确定哪个是正确的,控制器传入 WebForm1 或视图,并更改另一个以匹配。

【讨论】:

  • 假设 DataClasses1DataContext 包含一个 DbSet 当然称为用户。
  • 确实,我只是假设,因为他没有显示他的数据库上下文,但似乎是一个合理的假设。
  • 请问您如何让 DataClasses1DataContext 包含 DbSet?当我尝试添加 db.Users.ToList() 时,它没有编译。如果这是一个愚蠢的问题,我很抱歉,我对编程特别是面向对象的编程很陌生。我非常感谢您的帮助:)
  • 嘿,我猜我的假设是错误的。您能否发布您的 DbContext 的代码?那会有所帮助。核心问题仍然是您为视图提供了 WebForm1 列表,但视图需要用户列表。
  • 是DataClasses1.cs中的代码吗?代码是空的,它只是说部分类 DataClasses1DataContext { }
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多