'型号'不包含'对象"的定义

时间:2016-01-02 17:23:22

标签: c# asp.net-mvc linq

我试图从SQL查询中打印出数据,但是我在错误后遇到错误。

Bassically我想要做的是从数据库中取出教师的一些数据,然后在我的视图中列出它们。但是,每当我尝试打印时,都会收到此错误

  

视图模型'不包含' FirstName'的定义和不   扩展方法' FirstName'接受第一个类型的参数   '视图模型'可以找到。

这是我的代码;

视图模型

namespace Ability.Models
{
    public class ViewModel
    {
        public virtual IEnumerable<Teacher> Teachers { get; set; }
        public Teacher Teacher { get; set; }

        public virtual IEnumerable<Skill> Skills { get; set; }
        public Skill Skill { get; set; }
    }
}

控制器

public ActionResult Index()
        {
            string campus = Request.Params["Campus"];

            if (campus != null)
            {
                if (campus == "Alle")
                {
                    var teachers = (from t in db.Teachers
                                    select t);
                }
                else
                {
                    var teachers = (from t in db.Teachers
                                    where t.Campus == campus
                                    select t );
                }
            }
            else
            {
                var teachers = (from t in db.Teachers
                                select t);
            }

            var Model = new ViewModel
            {
                Teachers = db.Teachers.ToList(),
            };

            return View(Model);
        }

查看

@model IEnumerable<Ability.Models.ViewModel>

<h2>Teachers at Thomas More</h2>


               ...


@foreach (var Teacher in Model)
    {
        <tr>
            <td>
                @Teacher.FirstName
            </td>
            <td>
                @Teacher.LastName
            </td>
            <td>
                @Teacher.Email
            </td>
            <td>
                @Teacher.Campus
            </td>
        </tr>
    }

我不确定它是否合适,但我已经尝试过做一些事情,包括改变我的循环

@foreach (var Teacher in Model.Teachers)

然后我收到类似的错误

  

&#39; IEnumerable的&#39;不包含&#39;教师&#39;的定义   没有推广方法&#39;教师&#39;接受第一个类型的参数   &#39; IEnumerable的&#39;可以找到

期待我能收到任何帮助!

3 个答案:

答案 0 :(得分:3)

我看到一些没有意义的事情。

首先,您在哪里使用teachers

就个人而言,我认为以下代码更合理:

public ActionResult Index()
{

    IEnumerable<Teacher> teachers = Enumerable.Empty<Teacher>();

    string campus = Request.Params["Campus"];
    if (campus != null)
    {
        if (campus == "Alle")
        {
            teachers = (from t in db.Teachers
                        select t);
        }
        else
        {
            teachers = (from t in db.Teachers
                        where t.Campus == campus
                        select t );
        }
    }
    else
    {
        teachers = (from t in db.Teachers
                    select t);
    }

    var Model = new ViewModel
    {
        Teachers = teachers
    };

    return View(Model);
}

其次,您必须在上述操作方法中初始化ViewModel的其他属性。

现在让我们去看看。你传递了ViewModel类型的模型。当你想要遍历教师序列时,你可以试试这个:

@foreach (var teacher in Model.Teachers)
{
    <tr>
        <td>
            @teacher.FirstName
        </td>
        <td>
            @teacher.LastName
        </td>
        <td>
            @teacher.Email
        </td>
        <td>
            @teacher.Campus
        </td>
    </tr>
}

如果 db.TeachersIEnumerable<Teacher>,则上述所有内容都有意义

答案 1 :(得分:3)

您要将类型ViewModel发送到视图:

var Model = new ViewModel
{
    Teachers = db.Teachers.ToList(),
};

return View(Model);

但它期待类型IEnumerable<Ability.Models.ViewModel>

@model IEnumerable<Ability.Models.ViewModel>

也就是说,它期待集合,你提供对象

考虑到视图中的用法,您似乎应该将其更改为期望单个对象:

@model Ability.Models.ViewModel

这将允许您直接访问您正在寻找的房产:

@foreach (var Teacher in Model.Teachers)

侧注:控制器中的逻辑看起来不正确。您有条件地创建teachers变量,但从不使用它。相反,您只需实现数据库中教师的所有,并将所有发送给视图。如果您打算查看所有教师,则可以删除大部分代码。如果您打算查看特定教师,您可能希望使用您创建的变量。参考@Christos' answer以获取该实例。

答案 2 :(得分:0)

您的模型是ViewModel列表。您需要使用@foreach (var Teacher in Model.Teachers)