【问题标题】:'Model' does not contain a definition for 'Object"“模型”不包含“对象”的定义
【发布时间】:2018-10-15 22:16:14
【问题描述】:

我正在尝试从 SQL 查询中打印出数据,但我在一个又一个错误中遇到了错误。

基本上,我试图做的是从数据库中从教师那里获取一些数据,然后在我的视图中列出它们。但是每次我尝试打印时,都会出现此错误

ViewModel' 不包含 'FirstName' 的定义,并且没有 扩展方法 'FirstName' 接受类型的第一个参数 可以找到“ViewModel”。

这是我的代码;

视图模型

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)

然后我收到类似的错误

“IEnumerable”不包含“教师”的定义 并且没有扩展方法“教师”接受类型的第一个参数 可以找到“IEnumerable”

期待我能得到的任何帮助!

【问题讨论】:

    标签: c# asp.net-mvc linq


    【解决方案1】:

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

    首先,你在哪里使用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.Teachers是IEnumerable&lt;Teacher&gt;。

    【讨论】:

    • 感谢您的帮助,我按照您的建议更改了代码。但是我仍然得到红色下划线错误“'IEnumerable'不包含'Teachers'的定义并且没有扩展方法'Teachers'接受'IEnumerable'类型的第一个参数可以找到”
    • nvm,问题已解决,非常感谢您的回答
    • @NicolasDecroos 欢迎您。我很高兴能帮上忙:)
    【解决方案2】:

    您将ViewModel 类型发送到视图:

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

    但它期待类型IEnumerable&lt;Ability.Models.ViewModel&gt;:

    @model IEnumerable<Ability.Models.ViewModel>
    

    也就是说,它需要一个 collection,您将在其中提供一个 object。

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

    @model Ability.Models.ViewModel
    

    这将允许您直接访问您要查找的属性:

    @foreach (var Teacher in Model.Teachers)
    

    旁注:控制器中的逻辑看起来不正确。您有条件地创建了一个 teachers 变量,但从不使用它。相反,您只需将数据库中的 all 教师具体化,然后将它们 all 发送到视图。如果您打算查看所有教师,则可以删除大部分代码。如果您打算查看特定的教师,则需要使用您创建的变量。参考@Christos' answer 的实际示例。

    【讨论】:

    • 您好,感谢您的帮助。我试过你的解决方案,但它仍然给我错误“'IEnumerable'不包含'Teachers'的定义并且没有扩展方法'Teachers'接受'IEnumerable'类型的第一个参数可以找到” .对不起,如果这是一个明显的错误,这真的很新。
    • @NicolasDecroos:听起来您没有成功更改视图顶行的模型类型声明。你能确认一下吗?
    • 这是[AT]model Ability.Models.ViewModel这一行
    • @NicolasDecroos:很有趣。哪一行代码会引发该错误?
    • 对不起,我刚刚完全复制了你的行,现在可以了。一定是一个小错字。非常感谢您的所有帮助
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-27
      • 2017-01-18
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2015-11-27
      相关资源
      最近更新 更多