Contoso University ASP.NET MVC の例のパート 5 を見ていきます。
インストラクターが教えたコースを選択したときに、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);
}
** ビューの行では、次のように id を渡す必要がないのはなぜですか。
@Html.ActionLink("Select", "Index", new { id= ViewBag.InstructorID,courseID = item.CourseID })
ありがとう!