Невозможно получить общее количество элементов в модели в представлении 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 внутри, чтобы получить одну запись с соответствующим идентификатором. Вы можете свернуть сервис и репозиторий в один класс, если хотите, но я бы рекомендовал отделить бизнес-логику от доступа к данным.

Другие вопросы по тегам