如何使用jquery从局部视图调用警报消息

时间:2012-06-23 09:43:04

标签: jquery asp.net-mvc asp.net-mvc-partialview

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

我创建了一个错误模型,还有一个部分视图来重定向和渲染错误。

但是警告框中没有出现例外情况。如何编写常用操作以显示所有类型的例外情况?任何人都可以帮助。

这是我的代码:

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 });
        }
    }

ShowError动作:

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

错误模型:

公共类错误     {         public string Type {get;组; }         public string Message {get;组; }

    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);
    });
}

先谢谢你..快乐的编码!

2 个答案:

答案 0 :(得分: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 });
    }
}

答案 1 :(得分:0)

我认为你想在ajax调用中发生异常时在alert-box中显示错误。如果我纠正了你可以遵循这个。

当正常请求以及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对象。

有关异常处理的详细信息,请参阅此post