AJAX 仅适用于页面刷新

本文关键字:刷新 适用于 AJAX | 更新日期: 2023-09-27 18:22:05

我正在编写一个Web应用程序,允许用户创建问题并为这些答案分配答案和分数值。 我已经设置好了它,以便用户输入他们想要提出的问题数量,然后我拉出一个问题所需的所有字段。 当用户单击"保存和下一步"按钮时,这些字段将被清除,他们可以输入下一个问题信息。 每次单击"保存和下一步"时,我都使用AJAX将模型数据发布到我的服务器。 我的问题是,只有当我允许刷新我不想做的页面时,我的AJAX才会运行。

.HTML

<input type="submit" id="next" value="Save & Next" />

爪哇语

 $(document).ready(function () {
 $('#next').click(function(e) {
        var model = @Html.Raw(Json.Encode(Model));
        e.preventDefault();
        if (counter <= ques)
        {
            $.ajax({
                url: "/Questions/Create",
                type: "POST",
                data: JSON.serialize(model),
                cache: false,
                success: function (data)
                {
                }
            });
            //counter++;
        }
        else {
        }
    });
});

C# 服务器端

    [HttpPost]
    [ValidateAntiForgeryToken]
    public int Create(QAViewModel qa)
    {
        System.Diagnostics.Debug.WriteLine("madeit");
        if (ModelState.IsValid)
        {
            foreach (var item in qa.questions)
            {
                //add question data into the DB
                db.questions.Add(item);
            }
            foreach (var item in qa.questionAnswers)
            {
                db.answers.Add(item);
            }
            db.SaveChanges();
            return(1);
        }
        return (0);
    }

真正的问题来自e.preventDefault();如果我删除它,代码将运行,我的模型数据将按预期添加到我的数据库中。 添加e.preventDefault()时,AJAX 代码甚至没有执行。我尝试过使用<input type="button">因为它的默认操作不执行任何操作。

关于为什么会发生这种情况的任何想法?

溶液几个小时后,解决方案是在我的观点上使用@Html.AddAntiForgeryToken()。 我忘记了我正在检查防伪令牌,该令牌不允许 AJAX 将数据发布到我的控制器操作。

AJAX 仅适用于页面刷新

您正在使用不存在的函数JSON.serialize 。如果要将javascript对象或数组转换为JSON字符串,请使用JSON.stringify(object)

通过使用浏览器控制台检查引发的错误,可以轻松找到此问题

提交按钮用于提交表单内容。

当您不需要提交时,您应该使用普通按钮。但是,如果出于任何原因您仍然想使用提交按钮,您可能希望在方法的末尾return false,以避免提交按钮完成其工作。

$(document).ready(function () {
    $('#next').click(function(e) {
        var model = @Html.Raw(Json.Encode(Model));
        if (counter <= ques)
        {
            $.ajax({
                url: "/Questions/Create",
                type: "POST",
                data: JSON.serialize(model),
                cache: false,
                success: function (data)
                {
                }
            });
            //counter++;
        } else {
        }
        return false;
    });
});

在这里演示

一个快速且有点肮脏的解决方法是持有布尔值以使用您是否执行阻止默认值。

var preventBoolean = false;
$(document).ready(function () {
$('#next').click(function(e) {
    var model = @Html.Raw(Json.Encode(Model));
    if(preventBoolean)
    {        
         e.preventDefault();
    }
    preventBoolean = true;
    if (counter <= ques)
    {
        $.ajax({
            url: "/Questions/Create",
            type: "POST",
            data: JSON.serialize(model),
            cache: false,
            success: function (data)
            {
                 preventBoolean = false;
            }
        });
        //counter++;
    }
    else {
    }
});
});

我不确定您想在哪里再次打开它,但我已成功设置它。好的解决方案是绑定和取消绑定方法,但随后您必须处理事件。