0

我正在尝试使用 JQuery 检查数据库中是否存在电子邮件。目前,我正在通过$ajax请求发送电子邮件:

$(".newsletter form").submit(function (event) {
        event.preventDefault();
        var postData = JSON.stringify($(this).serialize());
        var status = $(".newsletter p");
        status.removeClass('shake');

        $.ajax({
            type: "POST",
            contentType: "application/json;charset=utf-8",
            url: "/Home/AddEmail",
            data: JSON.stringify(postData),
            dataType: "json", 
            success: function(data) {
                if (data == "success")
                    status.html("Thanks for your interest! We will let you know.").slideDown();

                else if (data == "subscribed")
                    status.toggleClass('shake').html("This email is already subscribed.").slideDown();

                else if (data == "invalid")
                    status.toggleClass('shake').html("This email is invalid.").slideDown();

                else if (data == "noValue")
                    status.toggleClass('shake').html("No email specified.").slideDown();

                else
                    status.toggleClass('shake').html("Oops, something went wrong!").slideDown();    

            },
            error: function () {
                status.toggleClass('shake').html("Oops, something went wrong!").slideDown();
            }
        });
    });

我的控制器通过以下方式获取它:

[HttpPost]
        public JsonResult AddEmail(EmailA email)
        {
            string returnMessage = "success";

            if (string.IsNullOrEmpty(email.ToString()))
            {
                return Json("noValue");
            }

            try
            {

                SqlConnection sqlConn =
                    new SqlConnection(ConfigurationManager.ConnectionStrings["ICECONNSTRING"].ConnectionString);

                sqlConn.Open();

                string sSQL = "SELECT COUNT(em_email) FROM v2_email WHERE em_email = @email";
                SqlCommand sqlCommand = new SqlCommand(sSQL, sqlConn) { CommandType = CommandType.Text };

                sqlCommand.Parameters.Add(new SqlParameter("@email", SqlDbType.NVarChar, 50)).Value = email;

                int count = (int)sqlCommand.ExecuteScalar();

                if (count == 0)
                {
                    return Json("subscribed");
                }
            }
            catch (Exception es)
            {
                Console.Write(es.Message);
                return Json("error");
            }


            return Json(returnMessage);
        }

        [Serializable]
        public class EmailA
        {
            public string email { get; set; }
        }

但值email始终为空。有人可以指出我哪里出错了吗?我是 MVC 新手

4

3 回答 3

1

在序列化表单时,您使用 JSON.stringify 两次。

这将导致错误的请求,例如:

JSON.stringify({x: 5, y: 6}); //"{"x":5,"y":6}"
JSON.stringify(JSON.stringify({x: 5, y: 6})); //""{\"x\":5,\"y\":6}""

更新:

正如我们从讨论中了解到的,问题在于发送的数据和请求的标头之间不匹配:因为contentType: "application/json;charset=utf-8",表单的值需要正确序列化。在对JSON.stringify($(this).serialize());表单数据的调用作为 JSON 对象发送之后,没有名称包含带有 urlencoded 表单数据的字符串。对于包含表单数据的常规帖子,contentType 标头需要为“application/x-www-form-urlencoded;charset=utf-8”,如果数据为 $(this),则由 JQuery 设置。 serialize() 所以正确的方法是,正如 BrunoLM 所建议的那样

....
$.ajax({
        type: "POST",
        url: "/Home/AddEmail", //without setting the contentType
        data: $(this).serialize(),
        dataType: "json", 
        success: function(data) {
...
于 2013-06-03T14:02:34.570 回答
0

您使用JSON.stringify了两次,实际上您所需要的只是

data: $(this).serialize()

这是 jsFiddle 上的一个工作示例

于 2013-06-03T14:02:37.980 回答
0

尝试这个:

var postData = { email: { email: $('#email').val() } };
于 2013-06-03T14:06:47.890 回答