【问题标题】:Why Ajax request is always showing error message while the JSon is always returning true?为什么 Ajax 请求总是显示错误消息,而 JSon 总是返回 true?
【发布时间】:2017-11-21 05:23:25
【问题描述】:

我不明白为什么会发生此错误。我有一个名为 SitePlanSaveTask 的方法,它创建新计划并在成功保存时返回 Json True。现在,当我调试计划成功保存的方法时,Json 总是返回 true。但在视图中它总是给出错误信息。我的问题是如果我的 Json 返回 true 那么为什么它不进入 Ajax 请求条件。

控制器:

  public ActionResult Create()
    {

        if (!User.IsInRole("Management"))
        {
            return RedirectToAction("AccessDenied", "Error");
        }

        ViewBag.ProjectId = new SelectList(db.Project, "Id", "Name");
        ViewBag.StartDate = DateTime.Now.Date;
        ViewBag.EndDate = DateTime.Now.Date;
        ViewBag.PlanDate = DateTime.Now.ToShortDateString();
        var status = new SelectList(new List<SelectListItem> { new SelectListItem { Text = "Active", Value = "A" }, new SelectListItem { Text = "Inactive", Value = "I" }, }, "Value", "Text");
        ViewBag.Status = status;
        List<ProjectTask> taskList = db.ProjectTask.ToList();
        ViewBag.ProjectTask = taskList;
        return View();
    }

  public JsonResult SitePlanSaveTask(string name)
    {
        ProjectTask projectTask = new ProjectTask();
        projectTask.Name = name;
        var check = db.ProjectTask.Where(x => x.Name == name).Count();
        bool flag = false;
        if (check == 0)
        {
            db.ProjectTask.Add(projectTask);

            flag = db.SaveChanges() > 0;
        }

        return Json(new { flag = flag, Id = projectTask.Id }, JsonRequestBehavior.AllowGet);
    }

查看:

  $("#btnAddTask").click(function (e) {
    e.preventDefault();
    $.ajax({

        type: "POST",
        url: "/ProjectSitePlanTasks/SitePlanSaveTask",
        data: {
            name: $("#TName").val()
        },
        dataType: "json",
        contentType: "application/json",
        success: function (result) {
            console.log(result);
            if (result.flag)
            {
                alert("Record saved successfully!");
                window.location = "/ProjectSitePlanTasks/Create";

            }
            else
            {
                alert("Saving failed!");
            }

        },
       error: function (result)
       {
            alert('error');
       }
    });
});

【问题讨论】:

  • 首先删除contentType: "application/json",。您收到哪条错误消息 - 保存失败!错误
  • 而 ajax 的全部目的是保持在同一页面上。您在回调中有window.location = "..."; 的事实意味着您不应该使用ajax。只需进行正常提交,即可节省编写此不必要脚本的时间。
  • @vipincp,这就是您检查ModelState 的原因,如果无效,您将返回视图,以便显示验证消息等,用户可以更正它们。当前的代码甚至没有指出错误是什么或者用户应该怎么做:)
  • window.location=".." 正在刷新整个页面 :) 如果您想保持在同一页面上并且只更新部分 DOM,那么您只需在 success 回调中执行此操作。您尚未指明要更新的内容,但假设您要显示新的 Id 值,那么如果元素是输入,它可能类似于 $(someElement).val(result.Id);
  • @StephenMuecke 是的,斯蒂芬。我只想指出,即使在 SUCCESS 上有重定向,我们也需要使用 ajax。我理解你的担心。感谢您指出。

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


【解决方案1】:

默认情况下,所有控制器操作方法都是 httpget。所以你必须使用下面的代码 sn-p 将其转换为 httppost。

[HttpPost]
public JsonResult SitePlanSaveTask(string name)
{
 ....
 ....
}

【讨论】:

  • 现在保存成功,但整个页面正在加载。我不想在创建新任务时加载整个页面
  • 我认为“btnAddTask”是提交类型的按钮。它不应该是提交类型的按钮。
  • 那你能告诉我它是什么类型的吗? @Jayesh
  • @Nabid,它绝对应该是一个提交按钮(这样您就可以检查表单是否有效(如果无效则取消它以便显示验证消息(您使用 e.preventDefault();meams不会进行正常提交)
  • @Nabid,您需要显示您的视图代码,如我之前所述,并说明您要更新的内容。我无法添加一个答案,只是对您要在视图中更新的内容进行疯狂猜测。这也将让我有机会解释您所做的所有其他不良代码和不良做法
【解决方案2】:

试试JSON.stringify(result)。然后采取 result.flag 。这可能有效。

【讨论】:

    【解决方案3】:

    试过了吗?

    [HttpPost]
    public JsonResult SitePlanSaveTask(string name){
    ...
    }
    

    【讨论】:

    • 是的,我已经尝试了解决方案,现在我创建新任务时页面正在加载。但我不希望在创建新任务时加载页面
    • 通过代码`window.location = "/ProjectSitePlanTasks/Create";`它总是刷新页面,并再次加载页面。也许您应该尝试另一种方式,例如在此页面中绑定数据而不是调用函数Create
    • 喜欢在 ajax 中调用 LoadDatapublic ActionResult LoadData(){ # do BindData ViewBag.ProjectTask = taskList; return View("your page address"); }
    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2012-04-03
    • 2021-09-11
    相关资源
    最近更新 更多