我有一个操作方法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);
});
}
先谢谢你..快乐的编码!
答案 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。