处理未处理的异常MVC4 C#knockout和ajax

处理未处理的异常MVC4 C#knockout和ajax,c#,jquery,ajax,asp.net-mvc-4,knockout.js,C#,Jquery,Ajax,Asp.net Mvc 4,Knockout.js,我正在使用knockout并使用下面给出的自定义函数对控制器进行ajax调用。如果发生任何未处理的异常,它将返回整个页面作为响应,这将导致响应显示页面的整个html。请建议正确的处理方法 function asyncComputed(evaluator, owner) { var result = ko.observable(), currentDeferred; result.inProgress = ko.observable(false); // Track whether we're w

我正在使用knockout并使用下面给出的自定义函数对控制器进行ajax调用。如果发生任何未处理的异常,它将返回整个页面作为响应,这将导致响应显示页面的整个html。请建议正确的处理方法

function asyncComputed(evaluator, owner) {
var result = ko.observable(), currentDeferred;
result.inProgress = ko.observable(false); // Track whether we're waiting for a result

ko.computed(function () {
    // Abort any in-flight evaluation to ensure we only notify with the latest value
    if (currentDeferred) { currentDeferred.reject(); }

    var evaluatorResult = evaluator.call(owner);
    // Cope with both asynchronous and synchronous values
    if (evaluatorResult && (typeof evaluatorResult.done == "function")) { // Async
        result.inProgress(true);

        currentDeferred = $.Deferred().done(function (data) {
            result.inProgress(false);
            if (data.hasOwnProperty("HasFailed") == true && data.ErrorCode == 1)//For Session Time Out 
            {
                $("#timeoutmessage")
                    .html('<div class="modal-backdrop">' +
                        '<div style="color:white;" class="middle">' +
                        '<div class="row-fluid"><div>Your session has timed out, please <a href="/">Login here </a>again.</div></div>' +
                        '</div>')
                    .show();

            }
            result(data);
        });
        evaluatorResult.done(currentDeferred.resolve);
    } else // Sync
        result(evaluatorResult);
});

return result;
}
我正在使用asycomputed函数进行ajax调用,如果任何ajax调用异常,所有ajax调用都会失败,并生成响应页面的html。
我可以在这里使用过滤器吗请建议

您可以在服务器上编写一个自定义操作过滤器,用于捕获异常并将其更改为JSON响应

public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = new JsonResult
        {
            Data = new { success = false, error = filterContext.Exception.ToString() },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}

然后,您只需将自定义属性添加到控制器操作中。

是否查看了HandleErrorAttribute?请参见Thank@elolos我已经这样做了,但我想在该特定区域显示错误消息我将如何做您需要检查result对象中的success属性(或使用HasFailed而不是success)。
public class MyErrorHandlerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = new JsonResult
        {
            Data = new { success = false, error = filterContext.Exception.ToString() },
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}