1

我有一个操作方法 Save() 来保存我的表单数据,并且我想在警报消息中显示运行时发生的异常,警报类型为错误。

我创建了一个错误模型以及一个用于重定向和呈现错误的部分视图。

但是异常不会出现在警告框中。如何编写一个通用操作来显示我的所有异常类型?任何人都可以帮忙。

这是我的代码:

调用 Save 操作的 Jquert:

    $("#save-icon").click(function (event) {
         event.preventDefault();
         if ($('#Code').val() != '' && $('#Name').val() != '') {
             $.post('@Url.Action("Save")', $("#form1").serialize());
         }
     });

保存操作:

    public override ActionResult Save()
    {
        try
        {
            ....
            regionClient.Save(ct);
            return Json(new { result = ct });
        }
        catch (Exception Ex)
        {
            return RedirectToAction("ShowError", new { ErrType="I", ErrMessage=Ex.Message });
        }
    }

显示错误操作:

    public ActionResult ShowError(string ErrType,string ErrMessage)
    {
        Error Err = new Error(ErrType, ErrMessage);
        return PartialView(Err);
    }

错误模型:

公共类错误{公共字符串类型{获取;放; } 公共字符串消息 { 获取;放; }

    public Error(string ErrType, string ErrMessage)
    {
        Type = ErrType;
        Message = ErrMessage;
    }
}

和部分观点:

@model iBoxV5.Models.Error
@section Scripts
{
    $(document).ready(function() {
      var message='@Model.Message';
      alert("Error:"+message);
    });
}

在此先感谢.. 快乐编码!

4

2 回答 2

0

我认为您想在 ajax 调用中发生某些异常时在警报框中显示错误。如果我是正确的,你可以按照这个。

每当在正常请求和 AJAX 请求中发生异常时, ASP.NET MVC 的内置错误处理机制总​​是返回Error位于共享文件夹中的错误视图 ( )。该Error视图也不会显示异常,它只显示纯文本。尽管如果您仍想在Error视图中显示错误,则直接向用户显示错误不是一个好主意,但您可以这样做。

共享/Error.cshtml

@model System.Web.Mvc.HandleErrorInfo

<h2>Exception details</h2>
<p>
    Controller: @Model.ControllerName <br>
    Action: @Model.ActionName
    Exception: @Model.Exception
</p>

您必须强烈键入Error要建模的视图才能在视图HandleErrorInfo中显示异常消息。

当回到 ajax 调用而不是返回Error视图时,最好返回一个JSON包含错误详细信息的对象。为此,您必须custom handle error filter如下所述创建一个,

public class CustomHandleErrorAttribute : HandleErrorAttribute
{
    private readonly ILog _logger;
 
    public CustomHandleErrorAttribute()
    {
        _logger = LogManager.GetLogger("MyLogger");
    }
 
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
        {
            return;
        }
 
        if (new HttpException(null, filterContext.Exception).GetHttpCode() != 500)
        {
            return;
        }
 
        if (!ExceptionType.IsInstanceOfType(filterContext.Exception))
        {
            return;
        }
 
        // if the request is AJAX return JSON else view.
        if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
        {
            filterContext.Result = new JsonResult 
            { 
                JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
                Data = new
                { 
                    error = true,
                    message = filterContext.Exception.Message
                } 
            };
        }
        else
        {
            var controllerName = (string)filterContext.RouteData.Values["controller"];
            var actionName = (string)filterContext.RouteData.Values["action"];
            var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
             
            filterContext.Result = new ViewResult
            {
                ViewName = View,
                MasterName = Master,
                ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                TempData = filterContext.Controller.TempData
            };
        }
 
        // log the error using log4net.
        _logger.Error(filterContext.Exception.Message, filterContext.Exception);
 
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 500;
 
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;      
    }
}

您必须替换HandleErrorAttribute注册Global.asax.cs到的,CustomHandleErrorAttribute然后您就完成了。现在,如果在 AJAX 调用中发生异常,您将获得一个 JSON 对象,其中包含异常详细信息。

有关异常处理的更多信息,请参阅这篇文章

于 2012-06-23T12:39:37.990 回答
0

这样做是不可能的,因为$.post是 AJAX 请求,您必须返回错误消息,例如JSON格式并从您的内部警告它$.post

$("#save-icon").click(function (event) {
     event.preventDefault();
     if ($('#Code').val() != '' && $('#Name').val() != '') {
         $.post('@Url.Action("Save")', $("#form1").serialize(), function(data) {
             if(data.type == 'error') {
                 alert(data.result);
             }
         });
     }
 });

您的操作方法可能是这样的:

public override ActionResult Save()
{
    try
    {
        // ....
        regionClient.Save(ct);
        return Json(new { type="success", result = ct });
    }
    catch (Exception e)
    {
        return Json(new { type="error", result = e.Message });
    }
}
于 2012-06-23T09:48:23.837 回答