【问题标题】:Cannot reach my controller via Ajax无法通过 Ajax 访问我的控制器
【发布时间】:2014-05-17 17:19:50
【问题描述】:

我是第一次尝试使用 Ajax。

我收到错误的问题:uncaught referenceError: Data is not defined 我可以在 Firebug 中看到

 <script>
        $(function () {

            var form = $("#ringMeBack");

            form.submit(function () {

                var emailData = {
                    RingMeBackName: $("#ringMeBackName").val(),
                    RingMeBackNumber: $("#ringMeBackNumber").val()
                    //, RingMeBackTime: $("#ringMeBackTime").val()
                };

                $.ajax({
                    url: "/Home/RingMeBack",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    dataType: "text",
                    data: JSON.stringify(emailData),   //THIS IS THE ERROR
                    success: function (response) {
                        alert(response);
                    },
                    error: function () {
                        alert("There was an error... please try again.");
                    }
                });

                return false;
            });
        });
</script>

 @using (Html.BeginForm("RingMeBack", "Home", FormMethod.Post, new { id = "ringMeBack" }))
        {
            <p>
                <input type="text" id="ringMeBackName" title="Optional, but it's nice to know who we are talking to." placeholder="Your name" />
            </p>
            <p>
                <input type="text" id="ringMeBackNumber" title="We need to know the best number to call you on." placeholder="Your phone number" />
            </p>
            <p>
                When is a good time to call you?
            </p>
            <p>
                <select title="When is the best time to call you?" id="ringMeBackTime">
                    <!--don't show if it's after 2pm -->
                    @if (DateTime.Now.Hour < 14)
                    {
                        <option value="asap">Today, as soon as possible</option>
                    }
                    <option value="am" id="ringBackMorning" /><!--values created in Javascript-->
                    <option value="pm" id="ringBackAfternoon" /><!--values created in Javascript-->
                </select>
            </p>

            <p>
                <input type="submit" value="Request call back" title="Send and we'll call you back" class="redButton"/>
            </p>

            @ViewBag.Status
        }

如果我将data: JSON.stringify(emailData) 更新为data: emailData.serialize(),则没有区别。

根据我引用的链接,如果我完全删除该行 (data: emailData.serialize()),那么它会命中我的控制器但不会传递任何值...

我不知道如何解决这个问题。

如果有帮助,我的控制器很简单

    [HttpPost]
    public void RingMeBack(string RingMeBackName, string RingMeBackNumber)
    {
        //break point set just to see if hits this
        string s = "";
    }

【问题讨论】:

  • emailData.serialize 绝对不行。
  • 只需传递emailData 而不进行任何序列化,因为 jQuery 会在内部为您进行转换。
  • data: emailData, 调用error: function()
  • 如果删除 contentType 参数会怎样?
  • 不是form.serialize()吗? serialize 函数用于“表单”元素,而不是随机对象api.jquery.com/serialize

标签: javascript ajax


【解决方案1】:

按照 cmets 中的建议,jQuery 应该为您完成从对象到 JSON 的转换,因此您只需将 data 参数设置为 data: emailData。然后你点击错误函数的原因是因为控制器没有返回任何东西——你没有看到一个成功的 ajax 事务。

【讨论】:

  • 我试过了,同样的错误仍然存​​在......我更新了我的控制器以返回一个 ContentResult。
  • 那么您的请求肯定有其他问题——我不知道,我会继续思考。但这是传递数据的正确语法。
  • 我以为你想知道,我解决了这个问题。返回类型 void 不是问题,因为我已经用 void 对其进行了测试 - 它不会引发异常......
【解决方案2】:

答案是因为一个愚蠢的错误

RingMeBackName: $("#ringMeBackName").val(),
RingMeBackNumber: $("#ringMeBackNumber").val()

应该是

'RingMeBackName': $("#ringMeBackName").val(),
'RingMeBackNumber': $("#ringMeBackNumber").val()

注意单引号。

JSON.stringify(theObject) 是必需的

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2021-06-16
    • 2021-01-30
    • 1970-01-01
    • 2018-12-09
    • 2020-07-17
    • 2016-01-23
    • 2016-12-21
    相关资源
    最近更新 更多