jQuery Ajax帖子没有传递参数

时间:2011-02-20 04:43:10

标签: c# jquery asp.net-mvc ajax json

我正在尝试使用jQuery的$ .ajax()函数将表单变量发布到MVC路由。问题是,当代码命中我的MVC操作时,即使数据传递给它们,所有参数都是null:

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());
            });
        }
    });
});

调用alert(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 {名称%20:%20%22Scott%20Smith%22%20email%20:%20%22scott @ smith.com%22%20message%20:%20%22Test%20message %22%20}

我是否在这里犯了任何明显的错误,导致我的ContactFormPost方法的参数始终为null?

4 个答案:

答案 0 :(得分:12)

取消引用postData,将$ .ajax传递给一个真正的JS对象。

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

答案 1 :(得分:3)

特立尼达对于取消引用该对象是正确的。您只需要使用ASP.NET AJAX服务,它希望数据以JSON字符串形式出现。

另一个问题是你的return语句需要明确允许GET动词,因为你试图使用它:

return Json(true, JsonRequestBehavior.AllowGet);

答案 2 :(得分:3)

Trinidad是对的,但是如果你必须发布JSON,那么使用POST方法,而不是GET。

答案 3 :(得分:3)

我有一个类似的问题,它会在我的桌面上完美地发布chrome和safari,但是当我在移动safari中尝试它时,当他们到我的webservice时,所有的值都将为null。

原来我的网址存在问题,因为我的网络服务上有一个过滤器,它将所有路径重定向到一个带有反斜杠的路径。

这将在移动版Safari中工作,否则会......

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

似乎safari不喜欢我的过滤器导致的临时重定向,并删除了数据。为了让它工作,我不得不将斜杠附加到我的ajax调用的url。:

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

更新:原来这不仅限于JS。基本表单帖子在移动Safari中具有相同的行为。这会将空值传递给我的服务:

<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>
相关问题