Невозможно получить общее количество элементов в модели в представлении ASP.NET MVC.
Я использую следующий код для отображения пейджера:
@Html.BootstrapPager(Request.QueryString("Page"), Function(index) Url.Action("Index", "Posts", New With {.page = index}), 14000, System.Web.Configuration.WebConfigurationManager.AppSettings("PageSize"), 15)
Моя проблема в том, что если я использую Model.Count
вместо 14000
тогда я получаю только 1 страницу записей, так как я использую skip and take в репозитории, чтобы получить только необходимые записи. Как я могу в представлении получить доступ к общему количеству опубликованных записей, чтобы мне не пришлось прямо указывать значение в представлении прямо сейчас?
Оригинальный код пейджера здесь. Я преобразовал это в VBNET, использую это. Это работает нормально, если количество записей жестко закодировано.
Это репо:
Dim posts As IEnumerable(Of PostSummaryDTO)
Using db As BetterBlogContext = New BetterBlogContext
posts = db.be_Posts.OrderByDescending(Function(x) x.DateCreated).Select(Function(s) New PostSummaryDTO With {.Id = s.PostRowID, .PostDateCreated = s.DateCreated, .PostSummary = s.Description, .PostTitle = s.Title, .IsPublished = s.IsPublished}).Skip((Page - 1) * PageSize).Take(PageSize).ToList()
Return posts.ToList
End Using
1 ответ
Вам нужно два разных метода на нижнем уровне - один для получения общего количества и один для получения нужной страницы - и затем вызовите их оба из вашего контроллера, передавая оба результата модели в представление. Таким образом, модель не может быть набором записей; это должен быть объект со свойством для коллекции записей и свойством для подсчета. Либо это, либо используйте ViewBag
пройти счет.
В моем офисе мы имеем служебный уровень, содержащий бизнес-логику и хранилище для доступа к данным. В репозитории есть единственный метод для возврата IQueryable
это обеспечивает доступ ко всем записям для конкретной таблицы. Затем в службе есть один или несколько методов, которые вызывают этот метод репозитория и используют его по-разному. В этом случае может быть GetTotalCount
метод и GetPage
метод в сервисе. Оба будут вызывать один и тот же метод хранилища, чтобы получить одинаковый IQueryable
и тогда первый метод вызовет Count
на результат в то время как второй метод будет вызывать Skip
а также Take
, Как Skip
а также Take
не форсируйте выполнение запроса, вы также позвоните ToArray
или тому подобное во втором методе. Служба также может иметь GetRecord
метод, который вы передадите идентификатор и позвоните FirstOrDefault
внутри, чтобы получить одну запись с соответствующим идентификатором. Вы можете свернуть сервис и репозиторий в один класс, если хотите, но я бы рекомендовал отделить бизнес-логику от доступа к данным.