如何从OneException方法重定向到错误页面,而不是在c#mvc中返回jQuery/Ajax调用

如何从OneException方法重定向到错误页面,而不是在c#mvc中返回jQuery/Ajax调用,ajax,asp.net-mvc-4,Ajax,Asp.net Mvc 4,我试图在异常发生时重定向到OneException方法中的错误页。但问题是我有Ajax函数,所以即使我在OneException类中重定向,它也不会重定向到错误页面,并且总是以执行Ajax函数结束。请任何人提出解决方案 这是我的控制器方法,当异常抛出时,它将根据异常方法调用基本控制器 public ActionResult DeleteConfirmed(int id) { try { strin

我试图在异常发生时重定向到OneException方法中的错误页。但问题是我有Ajax函数,所以即使我在OneException类中重定向,它也不会重定向到错误页面,并且总是以执行Ajax函数结束。请任何人提出解决方案

这是我的控制器方法,当异常抛出时,它将根据异常方法调用基本控制器

 public ActionResult DeleteConfirmed(int id)
        {
            try
            {

                string displayMessage = string.Empty;
                //Delete ward details and check successfulness of the function and return json result
                if (wardManager.DeleteWard(id) == true)
                {
                    displayMessage = CustomEnumMessage.GetStringValue(ConfirmationMessages.ConfirmationErrorMsg);
                    return Json(new { Message = displayMessage });
                }
                //Return json result if unsuccessfull 
                else
                {
                    displayMessage = CustomEnumMessage.GetStringValue(ConfirmationMessages.ConfirmationRemovedMsg);
                    return Json(new { Message = displayMessage });
                }

            }
            catch (System.Exception ex)
            {
                throw ex;
            }

        }
这是我的基本控制器OneException方法

protected override void OnException(ExceptionContext filterContext)
        {
            //Get exception type
            System.Type ExceptionType = filterContext.Exception.GetType();


            if (ExceptionType.Name == "DbUpdateException")
            {
                ViewData["ErrorMessage"] = filterContext.Exception.InnerException.Message;
                this.View("DatabaseException", filterContext.Exception).ExecuteResult(this.ControllerContext);

            }
            else
            {
                ViewData["ErrorMessage"] = filterContext.Exception.Message;
                this.View("ApplicationException", filterContext.Exception).ExecuteResult(this.ControllerContext);
            }

}
这是我的Ajax函数

$.ajax({
                    type: "POST",
                    dataType: "json",
                    jsonpCallback: "onJSONPLoad",
                    url: '@Url.Action("Delete")',
                    data: $('#form').serialize(),
                    success: function (data) {
                        $('#submit').hide();
                        TriggerMsg(data.Message);
                    },
                    error: function (xhr) {
                        if (xhr.getResponseHeader('Content-Type').indexOf('application/json') > -1) {
                            var json = $.parseJSON(xhr.responseText);
                            alert(json.errorMessage);
                        }

                    }
                });
我构建这个Ajax函数只是为了显示成功的消息,它避免了我重定向到错误页面。问题是,即使我重定向到OneException方法内的错误页面,最后触发Ajax错误:函数,但它不会重定向到DatabaseException或ApplicationException视图。有人能为这个问题提出解决方案吗


谢谢

您的问题是,当您从ajax函数执行post时,控制器中的任何结果都会返回到success函数

您要做的是将url返回到ajax函数,然后从那里重定向用户

在控制器中,返回以下内容

result = Json(new { redirect = Url.Action("ActionName", "ControllerName", new { area = "" }) });
然后在javascript中查找这个重定向变量,并将window.location设置为该变量

success: function (data) {
     if (data.redirect) {
            window.location.href = data.redirect;
        }           
    },

如果您还想传递一条消息,那么您可能可以将它放在会话中,例如控制器发出的
session[“ErrorMessage”]=error
,并在错误视图中以相同的方式使用它

我认为您需要检查请求是否是
OnException
中的Ajax,如果是,则返回JSON对象。看看这篇文章,它可能会对你有所帮助。您还必须将异常标记为已处理:
filterContext.ExceptionHandled=trueHi vortex…..实际上Ajax请求不在我的OneException中。Ajax请求位于DeleteConfirmation(它是另一个控制器)方法中,OneException方法属于另一个控制器。当DeleteConfirmation方法中发生异常时,首先触发OneException方法,然后我需要重定向到错误页。为什么不尝试使用
HandleError属性
?它解释了如何处理ajax调用。使用ajax时,不能在服务器上执行重定向。您可以做的是在error:function(xhr)中设置window.location.href=“ErrorPage”。但是你只会得到ajax errorHi vortex…..谢谢你的解决方案…..但结果是一样的。我也尝试了你的方法。当我使用带有HandleError属性的ajax函数时,当发生异常时,它不会重定向到错误页面。我的问题不会因此得到解决。