Asp.net mvc Contoso大学第5部分,在不传递参数的情况下读取相关数据
我正在浏览Contoso大学ASP.NET MVC示例第5部分 当我选择讲师教授的课程时,我无法完全理解id参数是如何传递给控制器/视图的。 在视图中,显示课程的部分如下所示:Asp.net mvc Contoso大学第5部分,在不传递参数的情况下读取相关数据,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正在浏览Contoso大学ASP.NET MVC示例第5部分 当我选择讲师教授的课程时,我无法完全理解id参数是如何传递给控制器/视图的。 在视图中,显示课程的部分如下所示: @if (Model.Courses != null) { <h3>Courses Taught by Selected Instructor</h3> <table> <tr> <th></th> <th&
@if (Model.Courses != null)
{
<h3>Courses Taught by Selected Instructor</h3>
<table>
<tr>
<th></th>
<th>ID</th>
<th>Title</th>
<th>Department</th>
</tr>
@foreach (var item in Model.Courses)
{
string selectedRow = "";
if (item.CourseID == ViewBag.CourseID)
{
selectedRow = "selectedrow";
}
<tr class="@selectedRow">
<td>
*@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })*
</td>
<td>
@item.CourseID
</td>
<td>
@item.Title
</td>
<td>
@item.Department.Name
</td>
</tr>
}
</table>
public ActionResult Index(int? id, int? courseID)
{
var viewModel = new InstructorIndexData();
viewModel.Instructors = db.Instructors.Include(r => r.OfficeAssignment)
.Include(r => r.Courses.Select(c => c.Department))
.OrderBy(i => i.LastName);
if (id != null)
{
ViewBag.InstructorID = id.Value;
viewModel.Courses = viewModel.Instructors.Where(
i => i.InstructorID == id.Value).Single().Courses;
}
if (courseID != null)
{
ViewBag.Courses = courseID.Value;
//eager loading
//viewModel.Enrollments = viewModel.Courses.Where(
// i => i.CourseID == courseID.Value).Single().Enrollments;
//equivalant, but explicit loading
var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
foreach (Enrollment enrollment in selectedCourse.Enrollments)
{
db.Entry(enrollment).Reference(x => x.Student).Load();
}
viewModel.Enrollments = selectedCourse.Enrollments;
}
return View(viewModel);
}
@Html.ActionLink("Select", "Index", new { id= ViewBag.InstructorID,courseID = item.CourseID })
为什么在**视图行中,我不必传递id,如下所示:
@if (Model.Courses != null)
{
<h3>Courses Taught by Selected Instructor</h3>
<table>
<tr>
<th></th>
<th>ID</th>
<th>Title</th>
<th>Department</th>
</tr>
@foreach (var item in Model.Courses)
{
string selectedRow = "";
if (item.CourseID == ViewBag.CourseID)
{
selectedRow = "selectedrow";
}
<tr class="@selectedRow">
<td>
*@Html.ActionLink("Select", "Index", new { courseID = item.CourseID })*
</td>
<td>
@item.CourseID
</td>
<td>
@item.Title
</td>
<td>
@item.Department.Name
</td>
</tr>
}
</table>
public ActionResult Index(int? id, int? courseID)
{
var viewModel = new InstructorIndexData();
viewModel.Instructors = db.Instructors.Include(r => r.OfficeAssignment)
.Include(r => r.Courses.Select(c => c.Department))
.OrderBy(i => i.LastName);
if (id != null)
{
ViewBag.InstructorID = id.Value;
viewModel.Courses = viewModel.Instructors.Where(
i => i.InstructorID == id.Value).Single().Courses;
}
if (courseID != null)
{
ViewBag.Courses = courseID.Value;
//eager loading
//viewModel.Enrollments = viewModel.Courses.Where(
// i => i.CourseID == courseID.Value).Single().Enrollments;
//equivalant, but explicit loading
var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
foreach (Enrollment enrollment in selectedCourse.Enrollments)
{
db.Entry(enrollment).Reference(x => x.Student).Load();
}
viewModel.Enrollments = selectedCourse.Enrollments;
}
return View(viewModel);
}
@Html.ActionLink("Select", "Index", new { id= ViewBag.InstructorID,courseID = item.CourseID })
谢谢 简单的回答是,这是Asp.net MVC发挥作用的一点魔力。当您对解析视图的同一控制器执行回发时,Razor视图引擎将保留以前传递的任何路由值。首次加载页面时,没有
Id
或CourseId
的值。第一次传回索引控制器(针对讲师)包括一个Id
,并且该Id
自动附加到此视图中对索引控制器的所有调用。因此,在第二次调用中,您只需添加CourseId
值,因为Id值已经附加到URL中。如果值已更改,或者正在链接到其他控制器,则只需提供Id
值。您可以通过手动检查Razor在第二个链接操作中生成的完整url来验证这一点。太好了!谢谢你的解释