none
Проблемы с отправкой данных на сервер RRS feed

  • Вопрос

  • После того как я сформировал XML-данные с помощью Ajax/jQuery в клиенте мне нужно эти данные послать на сервер. И тут я столкнулся с проблемами - данные не отправляются. Приведу, что у меня есть на данный момент:

    function SendXmlToServer(ServerXml) {
               $.ajax({ url: "/Home/XmlData",
                   type: "POST",
                    processData: false, 
                   data: { ResXml: ServerXml }, dataType: "xml",
                   success: function () {
                       alert("Успешно отправились данные");
                       return false;
                   }
               })
           }

    Что на сервере:

    [HttpPost]
            public ActionResult XmlData(string ResXml) 
            {
                int i = 8;
                i++; //Никакого смысла не имеет, использовал чтобы поставить точку останова.   
                return null;
            }
    
    

    Поставив брэкпоинт на серверной стороне, убедился, что серверная функция вызывается, но через ResXml ничего не передается (ResXml=null) . В чем причина????

    24 ноября 2012 г. 10:49

Ответы

  • Ошибка из-за того, как же я не догадался сразу, что мы пытаемя отправить объект, который не десериализуется, а надо бы текст.

    $(document).ready(function () {
        var id = 1;
        var XmlData;
        $.ajax({ url: "/Home/XmlData",
          data: { id: id }, dataType: "xml",
          success: function (data) {
            //XMLData - объект, а нужен текст, чтобы проходила сериализация.
            //У него есть своуство xml, которое и представляет строковое значение.
            XmlData = data.xml;
            $.ajax({
              type: "POST",
              url: "/Home/XmlDataQ",
              dataType: "xml",
              processData: true,
              data: { d: XmlData },
              success: function () { alert("Успешно отправились данные"); },
              error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
              }
            });
          }
        });
      })

    • Предложено в качестве ответа YatajgaEditor 25 ноября 2012 г. 14:26
    • Помечено в качестве ответа Higgs.Boson 25 ноября 2012 г. 14:38
    25 ноября 2012 г. 12:37
    Модератор
  • Получилось принять-отправить данные.

    Дело в том, что для разных браузеров разный подход должен быть...

    Для IE - это XmlData = data.xml;

    Для Хрома, и Firefox использую XmlData = (new XMLSerializer()).serializeToString(data);

    Вот почему сразу не получилось.

    Вобщем, хочу выразить огромную благодарность за оказанную помощь!!! Целых 2 дня провозился с этой проблемой

    • Изменено Higgs.Boson 25 ноября 2012 г. 14:18
    • Предложено в качестве ответа YatajgaEditor 25 ноября 2012 г. 14:26
    • Помечено в качестве ответа Higgs.Boson 25 ноября 2012 г. 14:40
    25 ноября 2012 г. 14:17

Все ответы

  • Странно, всё должно работать. Может у Вас переменная ServerXml пустая, проверьте в клиентском отладчике.
    24 ноября 2012 г. 13:02
    Модератор
  • В том-то и дело, что ServerXml не пустой, содержит XML
    24 ноября 2012 г. 13:08
  • Попробуйте не применять кодирование, установите processData: true. Хотя странно, не понимаю почему не должно работать.
    24 ноября 2012 г. 13:23
    Модератор
  • Вот собственно доказетельства того что в переменной что-то содержится

    24 ноября 2012 г. 13:29
  • processData: true - не дает желаемых результатов, напротив даже генерируется ошибка в браузере... Это для применения запросов GET, согласно документации
    24 ноября 2012 г. 13:36
  • Он должен кодировать данные, чтобы валидация на сервере проходила, иначе данные не будут приняты. Попробуйте отключить валидацию на методе действия:

    [ValidateInput(false)]
    public ActionResult XmlData(string ResXml) 
            {
                int i = 8;
                i++; //Никакого смысла не имеет, использовал чтобы поставить точку останова.   
                return null;
            }
    

    24 ноября 2012 г. 13:53
    Модератор
  • Валидацию я отключал, это ничего не дало мне... Никаких изменений не происходило
    • Изменено Higgs.Boson 24 ноября 2012 г. 14:08
    24 ноября 2012 г. 14:07
  • Тогда пройдёмся по шагам. Для начала посмотрите уходят ли данные на сервер, как показал тут.
    24 ноября 2012 г. 14:11
    Модератор
  • Код изменился поэтому выложу еще раз:

    function SendXmlToServer(ServerXml) {

               $.ajax({
                   type: 'post',
                   url: "/Home/XmlDataQ",
                   dataType: "xml",
                   processData: false,
                   data: { d: ServerXml },
                   success: function () { alert("Успешно отправились данные"); }
               });
           }

    [HttpPost]
            [ValidateInput(false)]
            public ActionResult XmlDataQ(string d) 
            {
                return null; //Ставим брекпоинт
            }

    На сервере d=null


    Видно что данные отправляeтся, что-то вроде [object Object], должны отправляться такие данные:

    <body>
       <type>
           <answer>true</answer>
           <answer></answer>
       </type>
    </body>
    В чем проблема?



    • Изменено Higgs.Boson 25 ноября 2012 г. 7:10
    24 ноября 2012 г. 14:36
  • Скорее всего дело тут в клиентских скриптах, например так у меня работает:

    <script src="../../Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
    <button id="send">send</button>
    <script type="text/javascript">
      function SendXmlToServer(ServerXml) {
        $.ajax({ url: "/Home/XmlData",
          type: "POST",
          processData: true,
          data: { ResXml: ServerXml }, dataType: "xml",
          success: function () {
            alert("Успешно отправились данные");
            return false;
          }
        })
      };
      $("#send").click(function () {
        var ServerXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
    "<f:filterChain" +
            "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
            "xmlns:f=\"urn:foo\">" +
        "<f:filter attributeId=\"number\">" +
            "<f:rangeCondition conditionSign=\"INCLUSION\" operator=\"BETWEEN\">" +
                "<f:low>5</f:low>" +
                "<f:high>15</f:high>" +
            "</f:rangeCondition>" +
        "</f:filter>" +
    "</f:filterChain>"; ;
        SendXmlToServer(ServerXml);
      });
    </script>

    Т.е. у Вас происходит ошибка сериализации и данные не отправляются.

    25 ноября 2012 г. 8:39
    Модератор
  • У меня механизм работы следующий: Берется с сервера XML (запросом GET), этот XML модифицируется и отправляется обратно (запросом POST)

    Например если был такой XML (то что приняли с сервера)

    <body>
       <type>
           <answer></answer>
           <answer></answer>
       </type>
    </body>

    То потом вставляется где надо инфа и получается вот что, это надо отправить обратно:

    <body>
       <type>
           <answer>true</answer>
           <answer></answer>
       </type>
    </body>

    25 ноября 2012 г. 8:50
  • Попробую, принять данные с сервера и тутже отправить обратно (без изменения). Отпишусь о результатах
    25 ноября 2012 г. 8:58
  • Принимаю с сервера данные и сразу передаю обратно

    Код на серверной стороне

    public ContentResult XmlData(int id) {
                XElement xe = null;
                string ConnectionString = @"Data Source=(local)\SQLEXPRESS; Initial Catalog=LSPI; Integrated Security=True";
                SqlConnection con1 = new SqlConnection(ConnectionString);
                string commandText = "SELECT AnswerTemplate FROM Questions WHERE id=" + id.ToString();
                SqlCommand command = new SqlCommand(commandText, con1);
                con1.Open();
                SqlDataReader Reader1 = command.ExecuteReader();
                while (Reader1.Read())
                {
                    SqlXml sx = Reader1.GetSqlXml(0);
                    XmlReader xr = sx.CreateReader();
                    xr.Read();
                    xe = XElement.Load(xr);
                }
                command.Cancel();
                con1.Close();
                return Content(xe.ToString(), "text/xml");
            }
    
    
    [HttpPost]
            [ValidateInput(false)]
            public ActionResult XmlDataQ(string d) 
            {
                return null;
            }

    Код на клиенте:

    $(document).ready(function () 
    {
       var id = 1;
       var XmlData;
       
          $.ajax({ url: "/Home/XmlData",
                   data: { id: id }, dataType: "xml",
                   success: function (data) 
                            {
                               XmlData = data;
                                $.ajax({
                                        type: "POST",
                                        url: "/Home/XmlDataQ",
                                        dataType: "xml",
                                        processData: false,
                                        data: { d: XmlData },
                                       success: function () { alert("Успешно отправились данные");}
                                      });
                             }
                  });
    })

    Теперь по шагам:

    1. Запрашиваем данные с SQL-сервера (там xml-данные хранятся в полях "xml"), причем обратите внимание, что когда мы передаем данные представлению там содержатся символы разделения строк \r\n, но удалив их с помощью replace(), ничего мне это не дало.

    2. Данные мы передали, теперь посмотрим, что мы приняли в браузере:

    Продолжение внизу (просто более двух изображений нельзя отправлять)

    25 ноября 2012 г. 10:52
  • в правой колонке содержимое переменной XmlData, это тоже самое но с использованием console.log(XmlData):

      3.Эти данные обратно отправляем на сервер, и что в результате получаем? Получаем d=null:



    Вроде все правильно, но не работает

    25 ноября 2012 г. 10:55
  • Еще, вот что показал Fiddler 

    Получается данные не передаются. Пробовал и не выдергивать с базы данных XML-документ, а создавать XElement объект и передавать его, но результаты такие же



    • Изменено Higgs.Boson 25 ноября 2012 г. 11:13
    25 ноября 2012 г. 11:04
  • Попробуйте поймать аргумент ошибки, если конечно она возникает:

    $(document).ready(function () {
        var id = 1;
        var XmlData;
        $.ajax({ url: "/Home/XmlData",
          data: { id: id }, dataType: "xml",
          success: function (data) {
            XmlData = data;
            $.ajax({
              type: "POST",
              url: "/Home/XmlDataQ",
              dataType: "xml",
              processData: false,
              data: { d: XmlData },
              success: function () { alert("Успешно отправились данные"); },
              error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
              }
            });
          }
        });
      })
    

    25 ноября 2012 г. 11:51
    Модератор
  • У меня Ваш XML не пошёл, пишет Invalid XML, странно что у Вас не так. Попробуйте дать мне выходной, в чистом виде, точь в точь, который отправляет контроллер.
    25 ноября 2012 г. 12:04
    Модератор
  • С учетом дополнительного кода:

     error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
              }

    Ошибок не срабатывает, все равно выводит "Успешно отправленные данные"

    25 ноября 2012 г. 12:13
  • А у Вас работает этот код, передаются данные?
    25 ноября 2012 г. 12:13
  • У меня ошибка вылетает с этим кодом, что XML неверный, поэтому и хочу в точь Ваш XML.
    25 ноября 2012 г. 12:20
    Модератор
  • Хорошо, у меня два варианта использования, сейчас покажу пример где не выдергивается данные с базы, а формируются на ходу:

    public ContentResult XmlData(int id) {
                XElement contacts =
        new XElement("Contacts",
            new XElement("Contact",
                new XElement("Name", "Patrick Hines"),
                new XElement("Phone", "206-555-0144"),
                new XElement("Address",
                    new XElement("Street1", "123 Main St"),
                    new XElement("City", "Mercer Island"),
                    new XElement("State", "WA"),
                    new XElement("Postal", "68042")
                )
            )
        );
    
                return Content(contacts.ToString(), "text/xml");
                
            }

    25 ноября 2012 г. 12:23
  • Ошибка из-за того, как же я не догадался сразу, что мы пытаемя отправить объект, который не десериализуется, а надо бы текст.

    $(document).ready(function () {
        var id = 1;
        var XmlData;
        $.ajax({ url: "/Home/XmlData",
          data: { id: id }, dataType: "xml",
          success: function (data) {
            //XMLData - объект, а нужен текст, чтобы проходила сериализация.
            //У него есть своуство xml, которое и представляет строковое значение.
            XmlData = data.xml;
            $.ajax({
              type: "POST",
              url: "/Home/XmlDataQ",
              dataType: "xml",
              processData: true,
              data: { d: XmlData },
              success: function () { alert("Успешно отправились данные"); },
              error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status);
                alert(thrownError);
              }
            });
          }
        });
      })

    • Предложено в качестве ответа YatajgaEditor 25 ноября 2012 г. 14:26
    • Помечено в качестве ответа Higgs.Boson 25 ноября 2012 г. 14:38
    25 ноября 2012 г. 12:37
    Модератор
  • Погодите, но у меня та же самая фигня)), то есть string d=null
    • Изменено Higgs.Boson 25 ноября 2012 г. 12:48
    25 ноября 2012 г. 12:47
  • Не понял, что Вы имеете ввиду.
    25 ноября 2012 г. 12:49
    Модератор
  • На Хроме ставлю брекпоинты вот сюда:

    Что получаю в переменных в этом месте:

    data.xml - undefined, соответственно, на север приходит d=null

    25 ноября 2012 г. 12:59
  • Только заметил что Firefox выдает ошибку:

    [Exception... "Component does not have requested interface"  nsresult: "0x80004002 (NS_NOINTERFACE)"  location: "JS frame :: http://localhost:2439/Scripts/jquery-1.5.1.js :: <TOP_LEVEL> :: line 7315"  data: no]

    25 ноября 2012 г. 13:01
  • IE выдает наши ошибки в скрипте - 0 и Ошибка аргумента
    25 ноября 2012 г. 13:04
  • Хром полностью прорабатыввает скрипт (без ошибок), но ничего не возвращает
    25 ноября 2012 г. 13:17
  • Получилось принять-отправить данные.

    Дело в том, что для разных браузеров разный подход должен быть...

    Для IE - это XmlData = data.xml;

    Для Хрома, и Firefox использую XmlData = (new XMLSerializer()).serializeToString(data);

    Вот почему сразу не получилось.

    Вобщем, хочу выразить огромную благодарность за оказанную помощь!!! Целых 2 дня провозился с этой проблемой

    • Изменено Higgs.Boson 25 ноября 2012 г. 14:18
    • Предложено в качестве ответа YatajgaEditor 25 ноября 2012 г. 14:26
    • Помечено в качестве ответа Higgs.Boson 25 ноября 2012 г. 14:40
    25 ноября 2012 г. 14:17
  • Вы меня опередили. Для разных браузеров объект строится разный, я протестировал его только в IE9, там работал. Но общая идея думаю уже понятна: проблема была с сериализацией, как сказал уже высше, поэтому данные нужно отправить в виде заранее десериализованной строки.
    25 ноября 2012 г. 14:22
    Модератор
  • Да) Это Вы дали указали в чем заключалась проблема, а дальше это уже дело техники

    В результате вставил код:

     if (window.ActiveXObject) {
    //для IE
                        XmlData = data.xml;
                    }
                    // для Мозиллы, Хрома, на опере еще не пробовал
                    else {
                        XmlData = (new XMLSerializer()).serializeToString(data);
                    };

    Еще раз ОГРОМНЕЙШЕЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!!


    • Изменено Higgs.Boson 25 ноября 2012 г. 14:28
    25 ноября 2012 г. 14:23
  • Не за что. Обращайтесь.
    25 ноября 2012 г. 14:25
    Модератор