2016-02-23 8 views
3

Я не знаю, почему PageCount, PageNumber и PageListPager не содержат определенности или не могут быть найдены. Он спрашивает, не хватает ли я директивы using или ссылки на сборку, но у меня есть ее в моем пользовательском контроллере.PagedList MVC не содержит определения для PagedListPager

Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount 
to 
@Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })) 

Примечание: ОБРАЗЫ И КОД НИЖЕ ТОЛЬКО ДЛЯ СПРАВКИ

Database Error

Visual Studio error

Контроллеры \ UserController.cs

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using RecreationalServicesTicketingSystem.Models; 
using RecreationalServicesTicketingSystem.DAL; 
using PagedList; 

namespace RecreationalServicesTicketingSystem.Controllers 
{ 
    public class UserController : Controller 
    { 
     private IssueContext db = new IssueContext(); 

     // 
     // GET: /User/ 

     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 users = from s in db.Users 
          select s; 
      if (!String.IsNullOrEmpty(searchString)) 
      { 
       users = users.Where(s => s.LastName.ToUpper().Contains(searchString.ToUpper()) 
             || s.FirstMidName.ToUpper().Contains(searchString.ToUpper())); 
      } 
      switch (sortOrder) 
      { 
       case "name_desc": 
        users = users.OrderByDescending(s => s.LastName); 
        break; 
       case "Date": 
        users = users.OrderBy(s => s.EnrollmentDate); 
        break; 
       case "date_desc": 
        users = users.OrderByDescending(s => s.EnrollmentDate); 
        break; 
       default: // Name ascending 
        users = users.OrderBy(s => s.LastName); 
        break; 
      } 

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

Просмотров \ User \ Index.cshtml

@model IEnumerable<RecreationalServicesTicketingSystem.Models.User> 

@{ 
    ViewBag.Title = "Users"; 
} 

<h2>Users</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
@using (Html.BeginForm("Index", "User", FormMethod.Get)) 
{ 
    <p> 
     Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) 
     <input type="submit" value="Search" /> 
    </p> 
} 

<table> 
    <tr> 
     <th> 
@Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter }) 
     </th> 
     <th>First Name 
     </th> 
     <th> 
      @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm }) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.LastName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.FirstMidName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.EnrollmentDate) 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.UserID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.UserID }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.UserID }) 
     </td> 
    </tr> 
} 

</table> 
<br /> 
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount 
to 
@Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })) 
+0

Включили ли вы свои заявления 'using'? И вы должны быть '@model IPagedList ' (не 'IEnumerable ') –

+1

Я пробовал, что вы предложили, и я получил эту ошибку. Сообщение об ошибке компилятора: CS0246: Не удалось найти имя типа или пространства имен «IPagedList» (вам не хватает директивы использования или ссылки на сборку?) Строка 32: Строка 33: Строка 34: открытый класс _Page_Views_User_Index_cshtml: System.Web .Mvc.WebViewPage > { Строка 35: Строка 36: # строка скрыта – TykiMikk

+1

Вы не можете просто изменить исходный вопрос (и я отменил ваши изменения). Вам нужно как '@using PagedList', так и' @using PagedList.Mvc; ' –

ответ

7

PageCount, PageNumber и т.д. является свойством IPagedList<T>, а не IEnumerable<T>. Вам нужно изменить модель в представлении, чтобы использовать IPagedList<T>, и включить соответствующие операторы использования.

@using PagedList; // add 
@using PagedList.Mvc; //add 
@model IPagedList<RecreationalServicesTicketingSystem.Models.User> // change 
@{ 
    ViewBag.Title = "Users"; 
} 
..... 
+1

Можете ли вы объяснить, в чем разница, используя IEnumerable и IPagedList? – TykiMikk

+0

[IEnumerable ] (https://msdn.microsoft.com/en-us/library/9eekhta0 (v = vs.110) .aspx) является базовым классом в .NET framework для перечисления коллекций. Он не содержит никаких свойств. [IPagedList ] (https://github.com/troygoode/PagedList/blob/master/src/PagedList/IPagedList.cs) - это интерфейс в сборке 'PagedList.Mvc', который расширяет' IEnumerable 'для добавления дополнительных свойств для 'PageCount' и т. д.' IPagedList 'is' IEnumerable 'but' IEnumerable 'is not' IPagedList ' –

+0

Что дает с удалением принятие/голосование? У вас все еще есть проблемы? –

1

Вы не хватает с помощью из PagedList и PagedList.Mvc, а другие сказали вам.

Что я могу добавить, лучше добавить использование пространств имен в файл Просмотров/Web.Config вместо этого. Это позволит вам использовать пространства имен PagedList и PagedList.Mvc во всех представлениях и сократите свой код. Пример:

<system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory" /> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
    <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Optimization"/> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="PagedList" />  <!--Add this line--> 
     <add namespace="PagedList.MVC" /> <!--Add this line--> 
    </namespaces> 
    </pages> 
</system.web.webPages.razor> 

И больше не нужно использовать используя в виду каждого/cshtml

@* @using PagedList; // No more need of this, can delete this line *@ 
@* @using PagedList.Mvc; // No more need of this, can delete this line *@ 
@model IPagedList<RecreationalServicesTicketingSystem.Models.User> // change 
@{ 
    ViewBag.Title = "Users"; 
} 
..... 

Это особенно ценно, когда у вас есть большой проект, это сократит ваш код.

Смежные вопросы