7

MVC 4を使い始めたばかりで、かなり楽しんでいますが、データベース(NAMEエントリとEMAILエントリのみ)ですべてのエントリをインデックスビューに表示しようとすると、問題が発生します。次のエラーが発生します。

ディクショナリに渡されるモデルアイテムのタイプは「System.Collections.Generic.List1 1[MobileWebFormver2.Models.WebForm1]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable[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チュートリアルサイト(リンク)のコードに従いましたが、エラーが発生します。任意のガイダンスをいただければ幸いです。

4

1 に答える 1

9

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.

于 2012-05-17T00:55:18.237 に答える