0

JQueryを使用してDBに電子メールが存在するかどうかを確認しようとしています。現在、$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は常に null です。誰かが私が間違っているところを指摘できますか? 私はMVCが初めてです

4

3 に答える 3

1

フォームをシリアル化するときに、JSON.stringify を 2 回使用します。

これは、例のように誤った形式のリクエストにつながります。

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 オブジェクトとして送信された後、URL コード化されたフォーム データを含む文字列を含む名前はありません。フォームからのデータを含む通常の投稿の場合、contentType ヘッダーは "application/x-www-form-urlencoded;charset=utf-8" である必要があります。これは、データが $(this) の場合に JQuery によって設定されます。 BrunoLM が提案したように、serialize() が適切な方法です。

....
$.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.stringify2回使用していますが、実際に必要なのは

data: $(this).serialize()

これはjsFiddleの実際の例です

于 2013-06-03T14:02:37.980 に答える