c# - 如何在局部视图 ASP.NET Core MVC 中使用不同的模型
问题描述
这是我的第一个 MVC 项目,我试图了解每个组件如何与另一个组件一起工作。我正在建立一个基本的学校系统(课程、学生和招生)。
在我的主视图 ( Calculus.cshtml
) 中,我从我的CourseController
. 现在,我想使用部分视图 ( _studentList
) 来显示从名为StudentController
.
我尝试了几种不同的方法:
首先,我只是使用控制器中的函数将 传递List<Student>
给局部视图,如下所示:
public async Task<IActionResult> StudentList(int id)
{
List<Student> StudentList = await _context.Student
.Include(s => s.Course)
.AsNoTracking()
.Where(x => x.Course.ID == id)
.ToListAsync();
return PartialView("_StudentList", StudentList);
}
(我还想提一下我的列表填充正确,它只是将此列表添加到视图中,以便我可以显示内容)。
微积分.cshtml
@model SchoolSystem.Models.Course
<div>
<h4>Calculus</h4>
<hr />
<dl class="row">
<dt class="col-sm-2">
@Html.DisplayNameFor(model => model.CourseDescription)
</dt>
<dd class="col-sm-10">
@Html.DisplayFor(model => model.CourseDescription)
</dd>
</dl>
</div>
<dd class="col-sm-10">
<partial name="_StudentList" />
</dd>
_StudentList.cshtml
@model SchoolSystem.Models.Student
<table class="table">
<tr>
<th>Student Name</th>
<th>StudentDOB</th>
<th>StudentPhoneNum</th>
<th>StudentPhoneNum</th>
</tr>
@foreach (var student in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => student.StudentName)
</td>
<td>
@Html.DisplayFor(modelItem => student.StudentDOB)
</td>
<td>
@Html.DisplayFor(modelItem => student.StudentPhoneNum)
</td>
<td>
@Html.DisplayFor(modelItem => student.studentAddress)
</td>
</tr>
}
</table>
但是,当我尝试这个时,我收到一条错误消息:
传入字典的模型项的类型为“SchoolSystem.Models.Course”,但该字典需要“SchoolSystem.Models.Student”类型的模型项
然后我正在阅读有关视图模型并尝试制作一个,但我仍然不知道如何在局部视图中使用不同的模型。这甚至可能吗?
在我的StudentList()
函数中,我将一个参数返回给局部视图 - 我将如何使用它?
return PartialView("_StudentList", StudentList);
Student.cs 模型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
namespace SchoolSystem.Models
{
public class Student
{
public int ID { get; set; }
[Display(Name = "Student Name")]
public string StudentName { get; set; }
[Display(Name = "Student Date of Birth")]
public string StudentDOB { get; set; }
[Display(Name = "Student Phone Number")]
public string StudentPhoneNum { get; set; }
[Display(Name = "Student Address")]
public string studentAddress { get; set; }
public virtual Course Course { get; set; }
}
}
抱歉所有问题,我只是想了解如何让我的程序正常工作。
解决方案
对于您的局部视图有一个 foreach 循环,您的局部视图需要一个类型的模型IEnumerable<Student>
。更简单的方法是返回带有课程模型和学生模型的视图,如果它们有关系,则无需指定返回局部视图的方法。
这是一个工作演示:
模型:
public class Student
{
public int ID { get; set; }
[Display(Name = "Student Name")]
public string StudentName { get; set; }
[Display(Name = "Student Date of Birth")]
public string StudentDOB { get; set; }
[Display(Name = "Student Phone Number")]
public string StudentPhoneNum { get; set; }
[Display(Name = "Student Address")]
public string studentAddress { get; set; }
public virtual Course Course { get; set; }
}
public class Course
{
public int ID { get; set; }
public string CourseDescription { get; set; }
public List<Student> Students { get; set; }
}
查看(Calculus.cshtml):
@model Course
<div>
<h4>Calculus</h4>
<hr />
<dl class="row">
<dt class="col-sm-5">
@Html.DisplayNameFor(model => model.CourseDescription)
</dt>
<dd class="col-sm-5">
@Html.DisplayFor(model => model.CourseDescription)
</dd>
</dl>
</div>
<dd class="col-sm-10">
<partial name="_StudentList" model="Model.Students" /> //change here....
</dd>
部分视图:
@model IEnumerable<Student> //change here....
<table class="table">
<tr>
<th>Student Name</th>
<th>StudentDOB</th>
<th>StudentPhoneNum</th>
<th>StudentPhoneNum</th>
</tr>
@foreach (var student in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => student.StudentName)
</td>
<td>
@Html.DisplayFor(modelItem => student.StudentDOB)
</td>
<td>
@Html.DisplayFor(modelItem => student.StudentPhoneNum)
</td>
<td>
@Html.DisplayFor(modelItem => student.studentAddress)
</td>
</tr>
}
</table>
控制器:
//GET:Home/Calculus/5
public async Task<IActionResult> Calculus(int? id)
{
if (id == null)
{
return NotFound();
}
var model = await _context.Course.Include(s=>s.Students)
.FirstOrDefaultAsync(m => m.ID == id);
return View(model);
}
推荐阅读
- angular - 单击按钮时组件不会重新加载
- python - 如何从 json 元素快速创建二维 numpy 数组?
- r - R markdown:将数据框中的值报告为文本
- python - Ubuntu 20.04 中的语音识别模块 [python] 出现问题
- xpath - 如何获取特定的 xpath 标记值
- python - TicTacToe Tkinter GUI 不断崩溃
- scala - json4s第一次序列化耗时异常长
- react-native-paper - 如何向 React Native Paper Paragraph 添加超链接或邮件链接?
- html - 星级评分组件在悬停时填充所有以前的星星
- android - AdMob:测试广告只展示一次,不再加载