aspx ashx mash-up - PullRequest
       5

aspx ashx mash-up

1 голос
/ 07 апреля 2011

Я обновляю страницу .aspx с функциональностью AJAX (используя VB, а не C #). Кодовое поле заполняет страницу данными, извлеченными из веб-службы. Страница имеет две панели, которые всплывают (с разными данными, конечно) таким образом. При полном обновлении страницы может потребоваться заполнение одной или обеих панелей. Но заполнение Panel 2 может занять много времени, и мне нужно иметь возможность обновлять Panel 1 без обновления Panel 2. Отсюда необходимость в AJAX (верно?)

Решение, которое я придумала, все еще имеет старую страницу .aspx с кодовым заголовком .aspx.vb, но в нее вводится страница Общего обработчика (.ashx). Эти первые два компонента выполняют работу при первом посещении пользователя или при полном обновлении страницы, но когда вызывается AJAX, запрос обрабатывается страницей .ashx.

Первый вопрос: это звуковая архитектура? Я не нашел ситуацию в Интернете, как у меня. Первоначально я хотел превратить страницу .aspx в обработчик AJAX с помощью функции codebehind, реализующей IHttpRequest, а затем с помощью методов «ProcessRequest» и «IsReusable», но я обнаружил, что не могу отделить регулярное посещение страницы от AJAX. запрос, поэтому мои обработчики AJAX вступили во владение даже при первом посещении страницы. Второй вопрос: прав ли я, что этот подход (заставляющий страницу .aspx выполнять двойную функцию в качестве обработчика AJAX) никогда не сработает? Разве невозможно определить, получаем ли мы запрос на полную страницу или запрос на частичную страницу (AJAX)?

Если архитектура хороша , то мне нужно динамически генерировать много HTML в файле .ashx, верно? Если это правильно, я должен отправить HTML обратно клиенту, или я должен каким-то образом его кодировать? Я слышал о шифровании JSON, но пока не понял, как его использовать. Итак, третий вопрос: является ли context.Response.Write единственным конвейером для отправки данных клиенту? И, если это так, я должен отправить обратно HTML или какой-то JSON-кодированный объект?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 08 апреля 2011

Звучит так, как будто странице требуется некоторая функциональность AJAX, добавленная в пользовательский интерфейс.

Предложите использовать UpdatePanel для каждого элемента веб-формы, который должен иметь функцию обновления AJAXy.Это избавит вас от необходимости рефакторинга множества кода и внесения большого количества HTML-кода в ваш .ashx.

Это будет более легко обслуживаемым в долгосрочной перспективе и потребует более короткого цикла разработки.

0 голосов
/ 08 апреля 2011

Как отмечают другие, UpdatePanel будет более простым способом, но вам нужно использовать несколько панелей обновлений со свойством UpdateMode , установленным как conditional. Затем вы можете запустить обновление панели обновления с помощью любой кнопки на странице (см. AsyncPostBackTrigger ) или даже с помощью java-скрипта (см. this & this ). На стороне сервера вы можете решить, что вызвало частичный постбэк, и действовать соответствующим образом, обходя определенный код, если он не нужен.

Вы также можете пойти по своему пути - хитрость заключается в том, чтобы захватить вывод страницы, используя HttpServerUtility.Execute в вашем ashx, и записать его обратно в ответ (см. эту статью , где этот трюк был использован для захвата вывода пользовательского управления). Единственным ограничением этого подхода является то, что вы можете имитировать только запросы GET к своей странице, и, возможно, вам придется изменить свою страницу, чтобы принимать параметры через строку запроса. Лично я предложу вам создать пользовательский элемент управления, который принимает параметры через метод / свойства и сгенерирует необходимый вывод, а затем использовать элемент управления на своей странице и в ashx (путем динмейческой загрузки его на временную страницу - см. Эту статью ).

РЕДАКТИРОВАТЬ: я использую jquery, чтобы проиллюстрировать, как это сделать из сетки-просмотра строки.

$(document).ready(function() {
   $("tr.ajax-grid-row").click(function() {
       $("#hidden-field-id").val($(this).find(".row-id").val()); // fill hidden filed
       $("#hidden-button-id").click(); // simulate button click
   });
});

Вы можете поместить вышеуказанный скрипт в элемент head в разметке - предполагается, что вы украсили каждое представление строки сетки классом css "ajax-grid-row", и у каждой строки будет скрытое поле, украшенное классом css " row-id "для хранения идентификатора строки или значения, которое вы хотите передать на сервер для этой строки. Вы также можете использовать ячейку (но тогда вам нужно использовать innerHTML, чтобы получить значение для строки). «hidden-field-id» и «hidden-button-id» - это идентификаторы клиента для скрытого поля и кнопки отправки - вы должны использовать Control.ClientID, чтобы получить фактические идентификаторы элементов управления, если это серверные элементы управления.

0 голосов
/ 08 апреля 2011

JSON не для этой цели, он должен передавать объекты, сериализованные с хорошей облегченной нотацией, если вам нужно передавать динамически генерируемый html, используя ashx, response.Write - это то, что у вас есть.Возможно, вы захотите взглянуть на MVC

. Или вы можете использовать jquery, если это просто HTML, простейшей будет функция load , или вы можете посмотреть вАякс с JQuery.Поскольку ashx может служить любым ресурсом, его можно использовать в функции загрузки.

0 голосов
/ 08 апреля 2011

Я согласен с @ p.campbell и @ R0MANARMY здесь. UpdatePanel может быть самым простым подходом здесь.

Но, как и я, если вы не хотите идти по маршруту UpdatePanel , я не вижу ничего плохого в вашем подходе. Тем не менее, создание html динамически (полностью) в бэкэнде - это не тот маршрут, который я лично выберу (по соображениям сопровождения). Я бы предпочел реализовать решение, которое будет отделять дизайн от данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...