Питання про розробку поточних реалізацій сторінки


12

Я перевірив реалізацію сторінки на asp.net mvc спеціально, і я дійсно вважаю, що є щось менш ефективне в реалізації.

Перш за все, у всіх реалізаціях використовуються значення сторінок як нижче.

public ActionResult MostPopulars(int pageIndex,int pageSize)
{

}

Те, що я вважаю неправильним, це pageIndex і pageSize повністю повинні бути учасниками класу сторінки, інакше цей спосіб виглядає настільки функціонально. Крім того, це спрощує пропуск зайвих параметрів у рівні застосування.

Друге, що вони використовують нижче інтерфейс.

public interface IPagedList<T> : IList<T>
{
    int PageCount { get; }
    int TotalItemCount { get; }
    int PageIndex { get; }
    int PageNumber { get; }
    int PageSize { get; }
    bool HasPreviousPage { get; }
    bool HasNextPage { get; }
    bool IsFirstPage { get; }
    bool IsLastPage { get; }
} 

Якщо я хочу перенаправити свою сторінку на різні дії, то мені доведеться створити нову модель подання для інкапсуляції імені дії в ній або навіть імені контролера. Іншим рішенням може бути те, що надсилаючи цю взаємодіючу модель для перегляду, то вкажіть як параметр дії та жорстко зашифрований контролер у методі пейджера як параметр, але я втрачаю повністю повторну корисність свого погляду, оскільки це суворо залежить від лише однієї дії.

Інша справа, що вони використовують нижче наведений код

Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount)

Якщо модель є IPagedList, чому вони не забезпечують метод перевантаження, як, @Html.Pager(Model)або навіть кращий @Html.Pager(). Ви знаєте, що ми знаємо тип моделі таким чином. До того, як я робив помилку, тому що використовував Model.PageIndex замість Model.PageNumber.

Ще одне велике питання - вони сильно покладаються на інтерфейс IQueryable. Як вони знають, що я використовую IQueryable у моєму рівні даних? Я б очікував, що вони працюють просто з колекціями, які зберігають постійність впровадження сторінок ігнорування.

Що не так у моїх ідеях удосконалення щодо їх реалізації сторінок? Яка їхня причина не реалізувати свої сторінки таким чином?


Мені це виглядає досить складно. Не те, щоб я цілком зрозумів, у чому саме проблема, але ... чи справді вам потрібно використовувати вбудовані помічники? Я навіть не знав, що вони мають пейджер. Я розробив колекцію власних помічників ще з часів MVC 1 Beta після моїх перших (і невдалих) спроб ужитися з вбудованими помічниками. Я рекомендую те ж саме вам. Якщо ви боретеся з цими помічниками, то це не краще, ніж WebForms, де ви боролися з серверними елементами управління.

ASP.NET MVC не має вбудованих помічників з питань створення сторінок, лише існують сторонні реалізації сторінки.
Пріснокровний

Дякую за цю частину інформації. Питання в тому, навіщо вам це потрібно? Немає зусиль реалізувати це самостійно, так, як ти хочеш.

Мені просто хотілося знати, що щось не так у моїх ідеях. Я порушив деякі основні принципи, якщо не так, чому всі вони дотримувались одного і того ж дизайну у своїх реалізаціях .. я цього не розумію
Freshblood

якщо код не може вирішити проблему програміста, код не має значення, краще уникайте його використання.
Шахер

Відповіді:


1

Як зазначав user8685: ваш інтерфейс здається зайвим для існуючих речей та принципів MVC.

Спробуйте це: інформація, яка вимагається від IPagedList, як-от індекс сторінок тощо, повинна бути реалізована в шарі бізнес-логіки та подаватися до перегляду / сторінки через загальну модель, яку можна подати назад на сервер і безпечно передавати та обробляти там. Чому? Бо те, що ви тут чітко збираєте, є вкладом у вашу інформаційну систему і як таке належить до шарів нижчих за інтерфейс користувача.

Цей шлях, можливо, не найкращий шлях, і, звичайно, не є найшвидшим, але повинен полегшити розуміння того, що вам насправді потрібно в частині абстрагування та архітектури даних, і таким чином допоможе вам усунути надмірність.

Крім того, наявні помічники часто містять занадто багато накладних витрат для простого використання, а іноді і придушують велику картину.


0

Я не використовував цей IPagedList або помічник, але це мій результат:

Це MostPopular(int pageIndex,int pageSize)явний інтерфейс, який говорить: я повертаю лише сторінки MostPopular речі. Ви чітко повідомте мені, яка сторінка та її розмір.

Якби вони зробили метод контролера, MostPopular(IPagedList<T> page)інтерфейс стає більш заплутаним. Ви повідомляєте контролеру загальну кількість предметів чи ні?

Коли контролер отримує ваш певний згаданий фрагмент даних, він, як правило, може виявляти різні інші дані, наприклад, скільки предметів у них є. На даний момент є сенс повернути такі дані до перегляду, тому він може вибірково використовувати деякі з них.

Це зовсім не означає , що IPagedList є модель, вона може точно також бути частиною моделі (властивість на ньому). Ймовірно, тому немає перевантаження без параметрів.

Вони могли б додати IPagedList як перевантаження, але тоді ви передасте набір (підказка, кута даних) маленькому помічнику пейджера, якому не потрібні самі фактичні дані. Просто потрібно знати, скільки сторінок / елементів і де ви знаходитесь на даний момент, щоб він міг виділити номер сторінки та таке. Ви б сказали помічнику набагато більше, ніж для його роботи потрібно знати. У тому, як він працює зараз, у нього нижня муфта, що добре.


Я просто хотів сказати, що параметром методу дії може бути об'єкт, який має властивість з назвою PageIndex та PageSize, так що таким чином ми могли б легко перевірити модель, оскільки хтось може підштовхнути величезний обсяг сторінки для атаки на продуктивність сервера. І якщо вони забезпечуватимуть перевантаження без параметрів, то перевантаження без параметрів може бути корисним, коли модель є IPagedList. Немає нічого поганого, якщо я передаю більше даних, ніж потребує помічник. Не існує такого строгого правила, як найкраща практика.
Свіжа кров

0

З огляду на те, що те, що клієнт запитує номер сторінки та те, що клієнт, швидше за все, змінюється, - це розмір сторінки, я думаю:

public ActionResult MostPopulars(int pageIndex,int pageSize)

Це досить розумний спосіб зробити це. Я бачив варіанти, коли використовувались ennum (перший, наступний, попередній, останній), але насправді це просто незручний спосіб сказати "pageIndex".

Я ще раз зазначу, що розмір сторінки буде і повинен сильно відрізнятися, залежно від залученого глядача ви повинні отримувати різні за замовчуванням для мобільних, портативних та робочих станцій на великому екрані, плюс, у багатьох випадках розумно дозволити кінцевому користувачеві вибрати, скільки саме елементів складається сторінки.

Я знаю, що це призводить до того, що багато параметрів передаються в рамках MVC, але вся концепція підкачки порушує MVC - ваша бізнес-логіка повинна знати про презентацію, щоб підказка працювала, щоб її завжди було безладним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.