繁体   English   中英

Ajax调用总是返回成功

[英]Ajax call always return success

我有一个对我的控制器的ajax调用,后者又调用一个返回true或false的服务。 我似乎无法弄清楚为什么当它从控制器返回到视图时总会触发我的成功函数。

调节器

[HttpGet]
public JsonResult TagUnit(int id, string selectedItem)
{
    try
    {
        var result = UnitClient.TagUnit(id, selectedItem);
        if (!result)
        {
            throw new InvalidOperationException();
        }
        return Json(new {success = true}, JsonRequestBehavior.AllowGet);
    }
    catch (Exception e)
    {
        return Json(new {success = false}, JsonRequestBehavior.AllowGet);
    }
}

Cshtml - Javascript - Ajax

 .on("select2-selecting", function (e) {
            var url = '@Url.Content("~/UnitDetails/TagUnit/" + Model.ViewUnitContract.Id)';
            var id = e.val;
            var tagName = e.object.text;
            console.log(id + " : " + tagName);

            $.ajax({
                url: url,
                data: { selectedItem: tagName },
                type: 'GET',
                dataType: 'json',
                success: function () {
                    alert('Success');
                },
                error: function () {
                    alert('Error');
                }
            });
        }).select2('val', ['1', '2']);

我在这里错过了什么?

您应该在success方法中验证服务器结果数据。

 $.ajax({
     url: url,
     data: { selectedItem: tagName },
     type: 'GET',
     dataType: 'json',
     success: function (data) {
        if (data != null && data.success) {
            alert('Success');
        } else {
            alert('Error');
        }
     },
     error: function () {
        alert('Error');
     }
 });

错误方法调用如果在服务器上发生500错误或服务器不可用等。

我认为如果你抛出异常,它仍将返回成功状态代码。 所以我所做的是创建一个可以附加到MVC方法的ajax调用错误处理程序属性。 它将捕获未捕获的异常,设置错误状态代码并提供一般错误消息(并且还记录到Elmah)。 该属性如下

public class HandleJsonErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        var serviceException = filterContext.Exception as Exception;

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        filterContext.Result = new JsonResult
        {
            Data = new
            {
                errorMessage = "Generic error message", 
                errorType = 0

            },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };

        var kayttaja = (Kayttaja.TKayttajantiedot)filterContext.HttpContext.Session["userKayttajanTiedot"];
        Global.HandleApplicationError(serviceException, kayttaja);

        filterContext.ExceptionHandled = true;

        // Log to elmah
        //Elmah.ErrorSignal.FromCurrentContext().Raise(filterContext.Exception);
    }
}

然后装饰你的动作方法只能由Ajax调用: [Campus.Attribuutit.HandleJsonError]

在ajax调用对象中触发错误处理程序的重要行是HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError

不知道我是否理解你的问题。

如果请求成功,将执行Ajax中的success函数。 如果请求失败,将执行错误功能。 您必须检查服务器在success函数内返回的内容。

http://api.jquery.com/jQuery.ajax/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM