ASP.NET Ajax "вручную" или как обратиться яваскриптом куда и как угодно

Для аякс-эффекта я обячно пользуюсь jQuery или UpdatePanel, но есть один проект, ято просто не хочется юзать jQuery для доступа к веб сервису (или вебсервисам).

Конечно его можно зарегить в системе, так, чтобы в яваскрипте появился специальный класс, для обращения к функциям сервиса, но для мееня это не подходило, я просто сам хотел отправлять и формировать POST/GET запросы, определаять формат возвращаемых данных.

В итоге начал смотреть в сторону класса Sys.Net.WebRequest, чем он примечателен:
позволяет нам создать запрос куда угодно, будь то страница или вебсервис.

ну да не будем разглагольствовать, лучше сразу пример:

7 <script type="text/javascript" language="javascript">

8 function sendYouName() {

9 var request = new Sys.Net.WebRequest();

10

11 request.set_url("ajax.ashx");

12 request.set_httpVerb("POST");

13

14 var body = "myName=" + $get("txtYouName").value;

15

16 request.set_body(body);

17 request.get_headers()["Content-Length"] = body.length;

18

19 request.add_completed(compliteSendName);

20

21 request.invoke();

22

23 return false;

24 }

25

26 function compliteSendName(sender, args) {

27 if (sender.get_responseAvailable) {

28 alert(sender.get_responseData());

29 }

30 else {

31 alert("Ошибка!");

32 }

33 }

34 </script>

35

36 Введите ваше имя: <input type="text" value="" id="txtYouName" /> <input type="button" onclick="javascript:return sendYouName();" value="Отправить" />



по порядку:
для начала создаем страничку, кидаем на нее ScriptManager и то что выше
при клике на кнопку я хочу отправить введенную пользователем строку, получить от сервера измененную строку и выдать ее пользователю, собственно на 36-й строке и размещаются элементы управления
при клике вызывается javascript функция sendYouName()
на 9-й строке создается экземпляр Sys.Net.WebRequest
на 11-й строке задаем адрес страницы, которой будут посылаться запросы
далее, на 12-й - выбираем метод запроса
на 14-й строке строим тело запроса, параметры которого можно будет прочесто из Request
на 19-й строке указываем функцию, вызывающуюся после прихода ответа от сервера
и на 21-й строке, при помощи метода invoke() запускаем запрос
А теперь внимание! Если body было задано в виде "a=1&b=2", то формат возвращаемых данных будет вида XML, - с этой подставой я некоторое время был в ступоре, но потом догадался, что если передавать данные данные в json, то такие и получим :)
Итого: ниже примеден пример кода, посылающего/принимающего запрос в формате json

39 function sendToGetClasses() {

40 var request = new Sys.Net.WebRequest();

41

42 request.set_url("ajax.asmx/GetMyObjects");

43 request.set_httpVerb("POST");

44

45 var body = "{ 't':1 }"; // + $get("txtYouName").value;

46

47 request.set_body(body);

48 request.get_headers()["Content-Length"] = body.length;

49 request.get_headers()["Accept"] = "application/json, text/javascript, */*";

50 request.get_headers()["Content-Type"] = "application/json";

51 request.add_completed(compliteToGetClasses);

52

53 request.invoke();

54

55 return false;

56 }

Оюратите внимание на 42-ю строчку - там для обращения к функции вебсервися через слешь написано название нужной функции, собственно ниже описание:


28 public class MyObject

29 {

30 public int ID;

31 public string Title;

32 }

33

34 [WebMethod]

35 [ScriptMethod(ResponseFormat=ResponseFormat.Json)]

36 public List<MyObject> GetMyObjects(int t)

37 {

38 var list = new List<MyObject>();

39

40 for (int i = 0; i < 10; i++)

41 list.Add(new MyObject { ID = i, Title = "Объект " + i });

42

43 return list;

44 }



тут для наглядности я возвращаю список объектов своего класса, а в яваскрипте мы можем обратиться к результатам уже как к списоку объектов с теми же полями, что и в моем классе :) яху!!!!

Комментариев нет:

Отправить комментарий

Можете оставить свой комментарий