【问题标题】:Two models in a view (with foreach)视图中的两个模型(使用 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 有问题,但我在网上找不到任何解决方案。请帮忙。

【问题讨论】:

    标签: asp.net-mvc-4 view model


    【解决方案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&lt;Student&gt;() { new Student()}; 在此处填充并像往常一样分配给 ViewModel。
    • 在我看来我需要做什么?我收到错误。在第一个@foreach 它说不包含学生的定义。
    • 确保更新您的@model 以反映其ViewModel 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多