0

我正在浏览 Contoso 大学 ASP.NET MVC 示例第 5 部分。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-应用

当我选择讲师教授的课程时,我不太明白 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 }) 

谢谢!

4

1 回答 1

0

简短的回答是,这有点像 Asp.net MVC 的作用。当您向解析视图的同一控制器执行回发时,Razor 视图引擎将保留任何先前传递的路由值。首次加载页面时,没有Id或的值CourseId。第一次传回索引控制器(对于讲师)包括一个Id, 并且Id自动附加到从此视图对索引控制器的所有调用。所以第二次调用,您只需添加CourseId值,因为 Id 值已附加到 URL。您只需提供一个Id如果值被更改,或者如果您正在链接到不同的控制器,则为 value。您可以通过手动检查 Razor 在第二个链接操作中生成的完整 url 来验证这一点。

于 2013-08-27T22:42:38.547 回答