将分页添加到传递ViewModel的现有ActionResult控制器

时间:2014-11-25 21:01:43

标签: asp.net-mvc entity-framework paging model-view

我在Visual Studio 2013 Pro中使用MVC 5,EF 6,Code First Web应用程序:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

我想组合一个具有分页功能的视图,并且还能够显示ViewModel中的相关数据。

在上面引用的Web应用程序中,Student Index视图(Controller中的ViewResult)具有分页和排序功能,并且不使用ViewModel。

在同一个应用程序中,教师索引视图(Controller中的ActionResult)没有分页和排序功能,但它通过在同一页面上使用“选择”Html.ActionLink显示相关数据(课程)作为讲师指数数据。

我喜欢提供分页和排序功能的Student视图,我也喜欢提供在现有Index页面上显示相关数据的能力的Instructor视图,但我不知道如何组合它们。

是否有人知道如何将分页功能添加到教师索引视图,同时仍然能够在同一个索引视图页面上显示相关数据?

提出同一问题的另一种方法是:如何在仍然能够显示相关数据的同时向教师索引视图添加分页和排序?

感谢任何帮助。

谢谢, 贝

以下是InstructorController.cs中的Index方法:

        public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
    {
        ViewBag.CurrentSort = sortOrder;
        ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;

        var instructors = from i in db.Instructors
                       select i;
        if (!String.IsNullOrEmpty(searchString))
        {
            instructors = instructors.Where(i => i.LastName.ToUpper().Contains(searchString.ToUpper())
                                   || i.FirstMidName.ToUpper().Contains(searchString.ToUpper()));
        }
        switch (sortOrder)
        {
            case "name_desc":
                instructors = instructors.OrderByDescending(i => i.LastName);
                break;
            case "Date":
                instructors = instructors.OrderBy(i => i.HireDate);
                break;
            case "date_desc":
                instructors = instructors.OrderByDescending(i => i.HireDate);
                break;
            default:  // Name ascending 
                instructors = instructors.OrderBy(i => i.LastName);
                break;
        }

        int pageSize = 3;
        int pageNumber = (page ?? 1);
        return View(instructors.ToPagedList(pageNumber, pageSize));
    }

以下是Instructor / Index.cshtml的视图代码的开头:

@model PagedList.IPagedList<LakesidePurchasing.ViewModels.InstructorIndexData>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />

    @{
        ViewBag.Title = "Instructors";
    }

    <h2>Instructors</h2>

    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>
            <th>Last Name</th>
            <th>First Name</th>
            <th>Hire Date</th>
            <th>Office</th>
            <th>Courses</th>
            <th></th>
        </tr>

        @foreach (var item in Model)
        {
            string selectedRow = "";
            if (item.ID == ViewBag.InstructorID)
            {
                selectedRow = "success";
            }
            <tr class="@selectedRow">
                <td>
            @Html.DisplayFor(model => Model.LastName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FirstMidName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.HireDate)
        </td>
        <td>
            @if (item.OfficeAssignment != null)
            {
                @item.OfficeAssignment.Location
            }
        </td>

1 个答案:

答案 0 :(得分:1)

这是你原来的模特:

public class InstructorIndexData
{
  public IEnumerable<Instructor> Instructors { get; set; }
  public IEnumerable<Course> Courses { get; set; }
  public IEnumerable<Enrollment> Enrollments { get; set; }
}

您希望显示已分页的教师数据,因此您需要将其更改为:

public class InstructorIndexData
   {
      public PagedList.IPagedList<Instructor> Instructors { get; set; }
      public IEnumerable<Course> Courses { get; set; }
      public IEnumerable<Enrollment> Enrollments { get; set; }
   }

这样填充:

var model = new InstructorIndexData
{
    Instructors = instructors.ToPagedList(pageNumber, pageSize),
    Courses = ?,
    Enrollments = ?
}
return View(model);

您传递给视图的模型没有更改,但是您访问讲师记录的方式有,但我收集了您可以成功显示分页数据。
课程如何填充注册属性取决于应显示哪些数据,您应该能够将它们最初设置为null以使其正常工作(您可能必须在视图中检查null以避免在尝试显示数据时出现错误来自null属性的值)

<强>更新

更改View @model声明:

@model InstructorIndexData

并且在foreach ......

@foreach (var item in Model.Instructors)
        {
           <td>@item.LastName</td>
           ... etc