Asp.net mvc Contoso大学第5部分,在不传递参数的情况下读取相关数据

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&

我正在浏览Contoso大学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);
    }
@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来验证这一点。

太好了!谢谢你的解释