1

我有一个对我的控制器的 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']);

我在这里想念什么?

4

3 回答 3

4

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

 $.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 错误或服务器不可用等,则调用错误方法。

于 2013-11-01T08:08:31.433 回答
0

我认为如果你抛出一个异常,它仍然会返回一个成功状态码。所以我所做的是创建一个可以附加到 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

于 2013-11-01T08:10:19.790 回答
0

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

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

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

于 2013-11-01T08:17:50.083 回答