我试图从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;可以找到
期待我能收到任何帮助!
答案 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.Teachers
是IEnumerable<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)
。