2016-07-09 2 views
2

Я могу заставить его работать (callback).AJAX вызов не возвращает объект JSON из WebMethod

Но что я получаю в ответ является весь HTML из default.aspx

The AJAX:

function CreateLottery(lottery) { 
debugger; // 'lottery' comes with the properties of the Lottery class 
$.ajax({ 
    type: 'POST', 
    url: 'default.aspx/Create', 
    data: JSON.stringify({ data: lottery }), 
    dataType: 'text', 
    success: function (data, status) { 
     alert(data.TotalValue + " " + status) //"undefined success" 
    }, 
    error: function() { 
     alert("error!") 
    } 
}); 
} 

я получаю "неопределенный успех" в боевой готовности. «данные» - это весь html-документ, а не «Lottery».

The СоздатьWebMethod и лотереи класс:

[WebMethod] 
public static Lottery Create(Lottery lottery) 
{ 
    return lottery; 
} 
public class Lottery 
{ 
    public string TotalValue { get; set; } 
    public string Players { get; set; } 
} 

Я не могу понять, что происходит, то WebMethod возвращается точно такой же объект, который он получил, как я не может получить к нему доступ при обратном вызове успеха?

EDIT: WebMethod не попадает. «ScriptManager» присутствует в default.aspx с EnablePageMethods установлен в true. Если я изменяю имя WebMethod (Create) на что угодно и сохраняю/создаю в URL-адресе AJAX, все равно получаю весь файл default.aspx в ответ.

+0

Подсказка: жалобы на downvotes, скорее всего, принесут больше downvotes. –

+0

Я удалил его. Разве вы не можете помочь вместо этого недружелюбного обращения? Возможно, ваше участие в законном вопросе действительно поможет мне. Благодарю. – Tiago

+1

Я не думаю, что он работает, «весь документ» - это, вероятно, 404 или 500 ответов HTTP. Вы действительно посмотрели содержимое «данных»? – Crowcoder

ответ

0

Я думаю, что есть две вещи, которые вы должны рассмотреть следующие вопросы:

Прежде всего: Вы должны исправить заголовок типа содержимого. Он должен быть application/json вместо text.

Другая проблема заключается в том, что [WebMethod] ожидает XML. Он не обрабатывает JSON из коробки.

Чтобы ваш WebMethod возвращал свое содержание в формате JSON, вам нужно будет дополнительно украсить его как ScriptMethod. Этот атрибут позволяет указать формат ответа как JSON.

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public static Lottery Create(Lottery lottery) 
{ 
    // ... 
} 

Ну, но есть одна вещь, которую я не уверен: В то время как вы можете указать ResponseFormat я не вижу способа указать RequestFormat. I предположим, что принимает JSON как тип запроса, когда вы определяете его как тип ответа. Но это только предположение. Попробуйте :-)

+0

Я пробовал все, что вы сказали, без успеха. Проблема заключается в том, что WebMethod никогда не попадает. «ScriptManager» присутствует в default.aspx – Tiago

+0

Слишком плохо :(Может быть, неплохо начать скрипач параллельно перехватывать трафик http и посмотреть, дает ли это дополнительные подсказки. – khlr

+0

Я просто изменил имя WebMethod на случайные имя и сохранить url (/ Create) в AJAX. Я все еще получаю весь HTML. – Tiago

0

Мы не можем сказать, почему он не работает для вас, но, возможно, вы могли бы попробовать другой подход. [WebMethod], по моему мнению, довольно хакерский, и, видимо, более сложный, чем должен быть. Вы можете добавить службу WebAPI в свой проект, но если вы хотите придерживаться веб-форм старой школы, вы можете реализовать IHttpHandler как файл ashx, который является «веб-сервисом». Обратите внимание, что .aspx-страницы также реализуют IHttpHandler, но они предназначены для возврата HTML, в то время как обработчики предназначены для общей обработки запросов, таких как загрузка файлов, и данных типа xml и json.

реализовать что-то подобное с шаблоном Обработчик пункта и ударил его с помощью AJAX вызова:

using System.IO; 
using System.Web; 

namespace WebApplication1 
{ 
    public class LotteryHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      context.Response.ContentType = "application/json"; 

      using (var reader = new StreamReader(context.Request.InputStream)) 
      { 
       string values = reader.ReadToEnd(); 

       //Use Newtonsoft to deserialize to Lottery type 

       //do whatever with Lottery 

       //Use Newtonsoft to serialize Lottery again (or whatever you want to return) 

       context.Response.Write(your_serialized_object); 

       //finish the response 
       context.Response.Flush(); 
       HttpContext.Current.ApplicationInstance.CompleteRequest(); 
      } 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 
} 
0

** старый код **

$.ajax({ 
    type: 'POST', 
    url: 'default.aspx/Create', 
    data: JSON.stringify({ data: lottery }), 
    dataType: 'text', 
    success: function (data, status) { 
     alert(data.TotalValue + " " + status) //"undefined success" 
    }, 
    error: function() { 
     alert("error!") 
    } 
}); 

** Новый код **

см. Здесь тип контента и тип данных

$.ajax({ 
     type: 'POST', 
     url: 'default.aspx/Create', 
     data: JSON.stringify({ data: lottery }), 
    contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (data, status) { 
      alert(data.TotalValue + " " + status) //"undefined success" 
     }, 
     error: function() { 
      alert("error!") 
     } 
    }); 
Смежные вопросы