JQuery AJAX "пост" вызов - PullRequest
       2

JQuery AJAX "пост" вызов

5 голосов
/ 29 августа 2011

Я новичок в jQuery и Ajax, и у меня возникают проблемы с 'post'.

Я использую вызов jQuery Ajax 'post' для сохранения данных в БД.Когда я пытаюсь сохранить данные, они передают значение null моему методу C #.JQuery выглядит следующим образом:

function saveInfo(id) {
        var userID = id; 
        var userEmail = $('.userEmail').val();
        var userName  = $('.userName').val();

        var dataJSON = {"userID": userID, "userEmail": userEmail, "userName": userName};

            $.ajax({
                type: 'POST',
                url: '../../Services/AjaxServices.svc/SaveUser',
                data:JSON.stringify(dataJSON),
                contentType: 'application/json; charset=utf-8',
                dataType: 'json'
            });
        return false;
    }`

.userEmail и .userName являются ссылками на классы для полей ввода.Код C # выглядит следующим образом:

[ServiceContract(Namespace = "http://testUsePage.com")]
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]                                                                        

public class AjaxServices
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle=WebMessageBodyStyle.WrappedRequest, ResponseFormat           = WebMessageFormat.Json)]
    public void SaveUser(User user)
    {
        //code here handles save
    }
}

У меня установлена ​​точка останова внутри метода SaveUser, и переданный объект User всегда имеет значение null.Спасибо!

РЕДАКТИРОВАТЬ: я переключил 'POST' на 'GET' в вызове ajax и атрибуте WebInvoke.Передача одного параметра ({"UserID": UserID}) в метод с подписью (public void SaveUser (строка UserID)) достигает точки останова и передает UserID без исключения.Переключение обратно на сообщение немедленно вызывает внутреннюю ошибку сервера.

Ответы [ 5 ]

5 голосов
/ 30 августа 2011

Вы должны отправить свои данные пользователя следующим образом:

{user: {userID: 1, ...}}

, так как вы используете wrappedrequest.Первым элементом в вашем json должно быть имя вашего параметра.

Остальная часть вашего кода выглядит нормально.Вы должны использовать stringify.

2 голосов
/ 29 августа 2011

Вы не устанавливаете свойство RequestFormat атрибута WebInvoke в значение json.

Также в вызове $ .ajax отправляйте данные: dataJSON без вызова JSON.stringify.

Если это не удастся, попробуйте следующее, которое будет публиковать закодированную информацию (по умолчанию), а не json. клиентская сторона

$.post('../../Services/AjaxServices.svc/SaveUser',
 {"userId": userID, "userEmail": userEmail, "userName": userName}
);

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

[WebInvoke(Method = "POST", UriTemplate = "SaveUser?userId={userId}&userEmail={userEmail}&userName={userName}")]
public void SaveUser(string userId, string userEmail, string userName)
2 голосов
/ 29 августа 2011

Вам не нужно использовать json для чего-то такого маленького. попробуйте это

function saveInfo(id) {
    var userID = id; 
    var userEmail = $('.userEmail').val();
    var userName  = $('.userName').val();
        $.ajax({type: 'POST',
            url: '../../Services/AjaxServices.svc/SaveUser/?userID='+userID+"&userEmail="+userEmail+"&userName="+userName,
        });
    return false;
}
0 голосов
/ 29 августа 2011

Проще говоря: атрибут data для $.ajax() является картой (объектом) данных, а не строкой данных. Не разбирайте объект перед отправкой:

var dataJSON = {"userID": userID, "userEmail": userEmail, "userName": userName};

$.ajax({
    type: 'POST',
    url: '../../Services/AjaxServices.svc/SaveUser',
    data: dataJSON,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json'
});
0 голосов
/ 29 августа 2011

Вы пытались открыть вкладку «Сеть» в Firefox Firefox и профилировать ваш звонок, чтобы посмотреть, какие фактические данные публикуются в веб-сервисе?Попробуйте, если данные там пустые, то вы знаете, что в вашем Javascript есть что-то неправильное, затем попробуйте отладить ваш Javascript.

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

public void SaveUser(string userID, string userEmail, string userName)

Я прочитал ваши комментарии, попробуйте это:

Нет строкового преобразования в вашем объекте JSON в клиентском скрипте

public class AjaxServices
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle=WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    public void SaveUser(string userID, string userEmail, string userName)
    {
        //code here handles save
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...