视图中的两个模型(使用 foreach)
Posted
技术标签:
【中文标题】视图中的两个模型(使用 foreach)【英文标题】:Two models in a view (with foreach) 【发布时间】:2013-06-27 04:05:20 【问题描述】:我有两个类 - Student.cs 和 Lecturer.cs 放在 Models 下。现在,在我看来,我必须将两个类放在一起。
我知道有一种方法 Tuple 可以解决这个问题。但我不知道下一步该做什么。我应该如何处理我的@foreach?
这是我的 cshtml 代码。
@model Tuple<MVCApp1.Models.Student, MVCApp1.Models.Lecturer>
@
ViewBag.Title = "MainPage";
Layout = "~/Views/Shared/_Layout.cshtml";
我正在使用表格,下面是我的@foreach 代码部分。
@foreach (var j in Model)
<tr>
<td">@j.FirstName
</td>
<td>@j.MiddleName
</td>
<td>@j.LastName
</td>
我需要有 2 个表,每个表都有不同的属性。 Student.cs 中的第一个表和第二个表将是 Lecturer.cs。 我知道@foreach 有问题,但我在网上找不到任何解决方案。请帮忙。
【问题讨论】:
【参考方案1】:元组不公开迭代器。
public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
您所追求的是ViewModel
。
public class ViewModel
public List<Student> Students get; set;
public List<Teacher> Teachers get; set;
public ActionResult Index()
ViewModel model = new ViewModel();
// retreive from database
model.Students = new List<Student>() new Student();
model.Teachers = new List<Teacher>() new Teacher();
return View(model);
然后你可以构建你的表格
<table>
<tr>
<th>First</th>
<th>Middle</th>
<th>Last</th>
</tr>
@foreach (var student in Model.Students)
<tr>
<td>@student.First</td>
<td>@student.Middle</td>
<td>@student.Last</td>
</tr>
@foreach (var teacher in Model.Teachers)
<tr>
<td>@teacher.First</td>
<td>@teacher.Middle</td>
<td>@teacher.Last</td>
</tr>
</table>
一旦您对此感到满意,您就可以探索每个层次结构的继承和实体框架 TPH 表。
你可能会得到这样的结果:
public abstract class Person
public int Id get; set;
public string First get; set;
public string Middle get; set;
public string Last get; set;
public class Teacher : Person
public string Class get; set;
public DateTime HireDate get; set;
public class Student : Person
public int Grade get; set;
public DateTime EnrolledDate get; set;
public class ViewModel
public List<Student> StudentsOnly get; set;
public List<Person> StudentsAndTeachers get; set;
public ActionResult Index()
Context db = new Context();
ViewModel model = new ViewModel();
// You could collect just the students
model.StudentsOnly = db.People.OfType<Student>().ToList();
// Or all of them
model.StudentsAndTeachers = db.People.ToList();
return View(model);
如果您只需要显示他们的姓名,那么您只需遍历单个人员列表。
<table>
...
@foreach (var person in Model.StudentsAndTeachers)
<tr>
<td>@person.First</td>
<td>@person.Middle</td>
<td>@person.Last</td>
</tr>
</table>
【讨论】:
您可以在您的项目中以/ViewModels/ViewModel.cs
或更具体的名称为该页面创建一个新文件夹。既然是桌子,那ListingViewModel.cs
new List<Student>() new Student();
在此处填充并像往常一样分配给 ViewModel。
在我看来我需要做什么?我收到错误。在第一个@foreach 它说不包含学生的定义。
确保更新您的@model 以反映其ViewModel
类型。以上是关于视图中的两个模型(使用 foreach)的主要内容,如果未能解决你的问题,请参考以下文章
带有模型和视图包的视图中的 C# MVC foreach 循环