Asp.net mvc 4 视图中的两个模型(使用foreach)

Asp.net mvc 4 视图中的两个模型(使用foreach),asp.net-mvc-4,view,model,Asp.net Mvc 4,View,Model,我有两个班——Student.cs和讲师.cs,放在模型下。现在在我看来,我必须把两个类放在一起 我知道有一种方法可以解决这个问题。但我不知道下一步该怎么办。我该如何处理我的@foreach 这是我的cshtml代码 @model Tuple<MVCApp1.Models.Student, MVCApp1.Models.Lecturer> @{ ViewBag.Title = "MainPage"; Layout = "~/Views/Shared/_Layout.

我有两个班——Student.cs和讲师.cs,放在模型下。现在在我看来,我必须把两个类放在一起

我知道有一种方法可以解决这个问题。但我不知道下一步该怎么办。我该如何处理我的@foreach

这是我的cshtml代码

@model Tuple<MVCApp1.Models.Student, MVCApp1.Models.Lecturer>

@{
    ViewBag.Title = "MainPage";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@模型元组
@{
ViewBag.Title=“主页”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
我使用的是一个表,下面是我的@foreach代码部分

@foreach (var j in Model)
            {
                <tr>
                    <td">@j.FirstName
                    </td>
                    <td>@j.MiddleName
                    </td>
                    <td>@j.LastName
                    </td>
@foreach(模型中的var j)
{

元组不公开迭代器

public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple
然后你可以组织你的桌子

<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>

弗斯特
中间的
最后
@foreach(模型中的var student.Students)
{
@学生,首先
@学生,中等
@学生,最后一位
}
@foreach(模型中的var教师,教师)
{
@老师,首先
@老师,中间
@老师,最后一位
}
一旦熟悉了这一点,就可以探索每个层次结构的继承和实体框架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);
}
公共抽象类人物
{
公共int Id{get;set;}
第一个公共字符串{get;set;}
公共字符串中间{get;set;}
公共字符串Last{get;set;}
}
公开课教师:人
{
公共字符串类{get;set;}
公共日期时间HireDate{get;set;}
}
公营班级学生:人
{
公共整数等级{get;set;}
公共日期时间注册日期{get;set;}
}
公共类视图模型
{
公共列表学生仅{get;set;}
公共列表学生和教师{get;set;}
}
公共行动结果索引()
{
Context db=newcontext();
ViewModel模型=新的ViewModel();
//你可以只收学生
model.StudentsOnly=db.People.OfType().ToList();
//还是全部
model.studentsandsteachers=db.People.ToList();
返回视图(模型);
}
如果只需要显示他们的姓名,那么您只需遍历单个人员列表

<table>
    ...
    @foreach (var person in Model.StudentsAndTeachers)
    {
        <tr>
            <td>@person.First</td>
            <td>@person.Middle</td>
            <td>@person.Last</td>
        </tr>
    }
</table>

...
@foreach(模型中的var人员、学生和教师)
{
@第一个人
@人,中间
@最后一个人
}

您可以在项目中的
/ViewModels/ViewModel.cs
下创建一个新文件夹,或者为该页面创建更具体的命名。因为它是一个表,所以
ListingViewModel.cs
新建列表(){new Student()};
在此处填充并像通常一样分配给ViewModel。我需要在视图中做什么?我遇到了错误。首先@foreach表示不包含学生定义。请确保更新@model以反映其类型
ViewModel
<table>
    ...
    @foreach (var person in Model.StudentsAndTeachers)
    {
        <tr>
            <td>@person.First</td>
            <td>@person.Middle</td>
            <td>@person.Last</td>
        </tr>
    }
</table>