JQuery Ajax пост не передавая параметры - PullRequest
5 голосов
/ 20 февраля 2011

Я пытаюсь использовать функцию $ .ajax () jQuery для отправки переменных формы в маршрут MVC.Проблема в том, что когда код попадает в мое MVC-действие, все параметры являются нулевыми, даже если данные передаются им:

jQuery:

$(function () {
    $('#signupform').submit(function (e) {
        e.preventDefault();

        if ($(this).valid()) {
            var postData = '{name : "' + $("#Name").val() + '", email : "' + $("#Email").val() + '", message : "' + $("#Message").val() + '" }';

            $.ajax({
                url: "/api/contact-form-post",
                data: postData,
                type: "get"
            })
            .complete(function (data) {
                $("#formContainer").html($("#formThankYou").html());
            });
        }
    });
});

оповещение о вызове (postData) выводит следующее:

{name : "Scott Smith", email : "scott@smith.com", message : "test message" }

Действие MVC:

public JsonResult ContactFormPost(string email, string name = "" , string message = "")
        {
            AddEmailToMailingList(email);

            if (!String.IsNullOrEmpty(name) && !String.IsNullOrEmpty(message))
            {
                InsertContactMessage(email, name, message);
            }

            return Json(true);
        }

Использование FireBug для проверки запроса показывает, что это URL,называется.Очевидно, что параметры URL не в правильном формате, но я не могу понять, почему.

http://localhost:10637/api/contact-form-post?{name%20:%20%22Scott%20Smith%22,%20email%20:%20%22scott@smith.com%22,%20message%20:%20%22Test%20message%22%20}

Я делаю здесь какие-либо очевидные ошибки, которые могут привести к параметрам моего ContactFormPostметод всегда быть нулевым?

Ответы [ 4 ]

12 голосов
/ 20 февраля 2011

Снять кавычку postData, передать $ .ajax реальный объект JS.

var postData = {
    name: $("#Name").val(),
    email: $("#Email").val(),
    message: $("#Message").val()
};
3 голосов
/ 02 августа 2013

У меня была похожая проблема, когда она превосходно публиковала в Chrome и Safari на моем рабочем столе, но когда я попробовал это в мобильном Safari, все значения были бы нулевыми, когда они попадали в мой веб-сервис.

Оказалось, что проблема с моим URL, потому что в моем веб-сервисе есть фильтр, который перенаправляет все пути на один с обратной косой чертой.

Это не будет работать в мобильном сафари, но в противном случае ...

$.ajax({
    ...
    url: 'foo',
    dataType: 'json',
    type: 'POST',
    ...
});

Казалось, что сафари не понравился временный редирект, вызванный моим фильтром, и он удалил данные. Чтобы заставить его работать, мне пришлось добавить косую черту в URL моего вызова ajax .:

$.ajax({
    ...
    url: 'foo/',  // note the trailing slash
    dataType: 'json',
    type: 'POST',
    ...
});

Обновление: оказывается, это не ограничивается JS. В мобильных сафари-сообщениях обычная форма сообщений одинакова. Это передает нулевые значения моему сервису:

<form action="foo" method="POST">
    <input type="text" name="pleaseDontBeNull" value="swearImNotNull"/>
</form>

Это работает правильно:

<form action="foo/" method="POST">  <!-- note the trailing slash -->
    <input type="text" name="pleaseDontBeNull" value="swearImNotNull"/>
</form>
3 голосов
/ 20 февраля 2011

Тринидад прав, но если вы должны опубликовать JSON, используйте метод POST, а не GET.

3 голосов
/ 20 февраля 2011

Тринидад прав насчет того, чтобы отменить цитирование объекта.Это нужно сделать только с помощью служб ASP.NET AJAX, которые ожидают, что данные будут представлены в виде строки JSON.

Другая проблема заключается в том, что в операторе return необходимо явно разрешить глагол GET, поскольку вы пытаетесьчтобы использовать это:

return Json(true, JsonRequestBehavior.AllowGet);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...