【发布时间】:2012-01-26 08:55:19
【问题描述】:
我编写了自己的 HandleError 属性。
在 ajax 请求期间发生错误时,我想返回部分视图,而当请求是非 ajax 时,应返回带有母版页的视图。
到目前为止,我写了这篇文章
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class IcpHandleErrorAttribute : FilterAttribute, IExceptionFilter
{
private readonly Type _exceptionType = typeof(Exception);
public IcpHandleErrorAttribute()
{}
public void OnException(ExceptionContext filterContext)
{
if (filterContext == null)throw new ArgumentNullException("filterContext");
if (filterContext.IsChildAction)return;
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)return;
Exception exception = filterContext.Exception;
if (new HttpException(null, exception).GetHttpCode() != 500)return;
if (!_exceptionType.IsInstanceOfType(exception))return;
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
ViewResultBase result;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
result = new PartialViewResult { ViewName = "ErrorAjax" };
}
else
{
result = new ViewResult{ViewName = "Error"};
}
result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model);
result.TempData = filterContext.Controller.TempData;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
但是,即使将 PartialViewResult 分配给结果,也会返回母版页。 为什么会这样?
ErrorAjax 局部视图
@model HandleErrorInfo
@{
Layout = null;
}
<div class="error">@Model.Exception.Message</div>
动作是通过jquery的post调用的。
action 方法是一个测试用例
[HttpPost]
public ActionResult Create(ProjectCreateCommand command)
{
throw new NotImplementedException("ajax");
return Post(command);
}
global.asax 的 Application_Start() 方法中的属性注册。
GlobalFilters.Filters.Add(new IcpHandleErrorAttribute());
RegisterGlobalFilters(GlobalFilters.Filters);
【问题讨论】:
-
能否请您显示您的自定义 HandleError 属性的完整代码以及您在哪里/如何注册它?
-
我添加了完整的代码。它是发货代码的副本,但略有修改。
-
试试这个链接可能会有所帮助stackoverflow.com/questions/3651171/…>
标签: asp.net-mvc