Раньше я был таким, как вы, несколько лет назад, я использовал увеличение производительности от UpdatePanel
до , чтобы неправильно понять, что я увеличивал производительность своих приложений ...
Ну, я был совершенно неправ, UpdatePanel
является корнем всего UI-зла, прежде всего оно скрывает сложность использования AJAX, которая облегчает большинство из нас, давая нам неверную идеючто мы создаем адаптивные приложения, что хуже, чем если бы мы вообще не использовали его (это основная причина, по которой я использовал его на всех своих страницах, и я уверен, что именно поэтому многие разработчики используют его ...потому что это легко).
Рассмотрим следующие статьи:
Когда вы поймете, что на самом деле UpdatePanel
делает против простого вызова PageMethod
или службы REST WCF, выувидеть огромную разницу между ними.
UpdatePanel
.Когда вы выполняете сообщение из UpdatePanel
, должен быть выполнен весь жизненный цикл страницы, это означает, что требуется отправить всю страницу ViewState для каждого сообщения, когда ваша страница усложняется с несколькими элементами управления, ViewState будетконечно, будет огромным, и это, безусловно, будет проблемой производительности.Используя их, вы получаете только частичный рендеринг , элементы управления внутри вашего UpdatePanel
будут отображаться без полной обратной отправки, хотя вам нужно отправлять весь ViewState при каждом запросе.
PageMethod
.Методы страницы static
, они вызываются так, как если бы они были сервисными методами, им не нужно создавать весь жизненный цикл страницы для выполнения, поэтому они выполняются быстрее.
Казалось бы, использование PageMethods
было бы решением, проблема в том, что PageMethods
обычно используются для возврата объектов JSON, что означает, что вам придется визуализировать эти объекты вручную ,Это означает, что если вы хотите избавиться от всех своих UpdatePanel
, вам придется изменить элементы управления, используемые в ваших представлениях, вы не сможете использовать, например, GridView
из коробки,вместо этого вам придется изменить его для JQGrid (или аналогичного).
Это естественно, если вы создаете приложение MVC, но с традиционным ASP.Net это не так просто.
Вам также необходимо учесть что-то очень важное, ViewState проверяется по умолчанию для каждого сообщения , вы можете отключить его, но это не рекомендуется, если вы хотите быть уверенным, что ваш ViewState имеетне был поврежден ( посмотрите на этот вопрос ).
Рассмотрим этот пример, у вас есть два DropDownList
элемента управления (с именем: ddl1, ddl2) ddl2 зависит от ddl1 , поэтому, используя событие SelectedIndexChanged
, вы заполняете второй выпадающий список.Но если вы попытаетесь сделать то же самое, используя вызовы AJAX (без UpdatePanel
), вы столкнетесь с двумя проблемами
Рендеринг, вам необходимо вручную добавить объекты в HTML select
элемент управления, представляющий DropDownList
.Вы можете использовать сторонний фреймворк для связывания этих элементов управления с помощью javascript, я могу порекомендовать вам knockoutjs (это круто)
Это проблема. После того, как вы изменили содержимое второго DropDownList
с помощью javascript, вы не можете сделать простую публикацию на своей странице, потому что ViewState не будет действительным , и вы увидите следующее исключение:
Недопустимый аргумент обратной передачи или обратного вызова.
Обходной путь - указать, какие значения будут действительны на стороне сервера, для этого вам нужнопереопределить метод страницы Render
и указать каждое из значений второго раскрывающегося списка , но это увеличит размер страницы и, очевидно, это не очень хороший вариант
Взгляните:
Итак, если вы хотите избавиться-вне всех ваших UpdatePanel
элементов управления вам нужно будет заменить существующие серверные элементы управления на дружественные к JavaScript элементы управления.Также помните, что если вы сделаете это, вместо того, чтобы полагаться на механизм публикации страниц, вам придется использовать AJAX для выполнения операций на сервере, в противном случае вы получите исключение Недопустимый обратный вызов или обратный вызов. .Другими словами, было бы лучше рассмотреть возможность перехода на приложение MVC, если это возможно.