【问题标题】:Function not working without contentType: 'application/json'没有 contentType 功能无法工作:'application/json'
【发布时间】:2018-02-26 08:39:00
【问题描述】:

我的问题是 ajax 中的成功功能有效但错误无效但如果添加到 contentType: 'application/json' 工作总是错误功能。

 $.ajax({
                    type: "POST",
                    data: { pollCodeInput: pollCodeInput, pollNameInput: pollNameInput, promotionPoints: promotionPoints },
                    url: "http://Work.local/mvc/KeyFacts/CreatePoll2",                       
                    //contentType: 'application/json',
                    success: function () {
                        openNav();
                        $('#modal').removeClass('modal-open');                         
                    },
                    error: function () {
                        alert("error!");
                    }                             
               });

            });

当我调试时,我的控制器工作正常。这是我的控制器;

[HttpPost]
    public ActionResult CreatePoll2(string pollCodeInput, string pollNameInput, int promotionPoints = 0)
    {
        MethodResult result = BusinessComponentRegistry.SingleInstance.PollManager.Create(pollCodeInput,
            pollNameInput, 0);
        if (result.HasErrors)
        {
            ViewBag.ErrorCreatePoll = result.Messages.ToString();
            return Json(new { success = false, responseText = "The attached file is not supported." }, JsonRequestBehavior.AllowGet);

        }
        else
        {
            ViewBag.SuccessCreatePoll = result.Messages.ToString();             
            return Json(new { success = true, error = false, responseText = "Success!!" }, JsonRequestBehavior.AllowGet);
          }
    }

【问题讨论】:

  • 查看documentation,了解如何从错误处理程序中获取一些有用的信息,而不仅仅是警告“错误!”
  • 如果你返回一个成功的结果,你为什么期望error: 处理程序启动?仅仅因为成功的结果包含一个布尔值,它仍然是成功的。
  • 您要么需要在success: 处理程序中处理success=false,要么不返回有效的(200)结果,例如if (result.HasErrors) throw new InvalidOperation(Not supported')`
  • 你试过这个“contentType:”application/json; charset=utf-8","
  • 实际上,我不太了解,但是 if(result.HasErrors) 函数适用于例如:用户输入 null 或现有 pollCode 并且即使显示成功函数不保存现有 pollCode 它也可以正常工作或 null pollCode

标签: jquery ajax asp.net-ajax


【解决方案1】:

问题是您的 ActionResult 返回 OK (http 200) 因为两个分支都返回有效的Json

return Json(new ...

所以ajax 调用总是会触发success: 回调。

在您的操作中,您处理 PollManager 未正确创建并作为成功 result 返回到 ajax 的情况。

在该结果中是一个标志,表明“成功”为假,但这不是用于success: 回调的相同成功 - 这里没有按约定配置.您可以轻松地将该值称为其他值,例如:

return Json(new { workedlikeacharm = false ...

因此,这里最好的 (IMO) 选项是保持操作不变,将有效结果返回给 ajax,并带有一个说明该做什么的标志,并在 success: 回调中处理它,例如:

success:function(result) {
    if (result.success == true) {
        openNav();
        $('#modal').removeClass('modal-open');
    } else {
        alert(result.responseText);
    }

但是,如果您想保持 ajax 成功/失败并更改 Action,那么您需要更改返回的内容:

if (result.HasErrors)
    return new HttpStatusCodeResult(500, "file is not supported");

因为现在返回的是 500 而不是 200(200 隐含在有效的 return new Json(.. 中),因此 javascript 代码将触发 error: 回调。

或者,您可以只抛出一个异常(这将生成 500 状态码结果),例如:

if (result.HasErrors)
    throw new InvalidOperationException("file is not supported");

在这两种情况下,如果您想查看消息,则必须更新您的 error: 处理程序以读取 http 状态消息。

【讨论】:

  • 谢谢,我现在意识到问题并来编辑我的帖子,但这个答案非常清晰易懂
【解决方案2】:

首先请将你的 all 参数设为对象

   var obj = {};
        obj.first_name = $("#FirstName").val();
        obj.last_name = $("#LastName").val();
        obj.email_id = $("#Email").val().toLowerCase();
        obj.gender = $("#Gender").val();
        obj.birth_date = $("#BirthDate").val();
        obj.address = $("#Address").val();
        obj.cell_phone = $("#Phone").val();
        obj.user_name = $("#UserName").val();
        obj.password = $("#Password").val();
        obj.security_question = $("#SecurityQuestion").val();
        obj.security_answer = $("#SecurityAnswer").val();   
        obj.role_id = $("#EmployeeType").val();
        obj.access_level = $("#AccessLevel").val();
        obj.business_id = businessId;
        obj.isActive = "true";
        obj.teamlead_id = $("#TeamleadName").val();
        obj.projectlead_id = $("#ProjectleadName").val();
        obj.manager_id = $("#ManagerName").val();

现在用这个 json 方法转换它们

   dataValue = JSON.stringify(obj);

并像这样使用它

  $.ajax({
        type: "POST",
        url: strUrl,
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        data: dataValue,
        async: false,
        success: onSuccess,
        error: function (err) {
            callLoader(false);
            swal({
                title: "Something Wents Wrong", text: "", type: "error",
                showCancelButton: false, closeOnConfirm: true, confirmButtonText: "OK",
            }, function (isConfirm) {
                window.location = "signin";
            });
            // console.log(err);
        }
    });
}

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2018-01-24
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2013-12-16
    相关资源
    最近更新 更多