我有这段代码。
public ActionResult Index()
{
ReceiptModel model = new ReceiptModel();
try
{
model = new ReceiptModel(context);
}
catch (BussinessException bex)
{
ModelState.AddModelError("Index", bex.MessageToDisplay);
return View("Index");
}
return View(model);
}
BussinesException ir从数据库返回,然后显示给用户。我必须在每个控制器方法上加上try-catch语句,这有点单调乏味。有没有更简单的方法来处理这些异常?
P.S。所有其他例外都由HandleExceptionAttribute
更新:
我使用了Floradu88方法。所以现在我有这样的事情。
public sealed class HandleBussinessExceptionAttribute : HandleErrorAttribute, IExceptionFilter
{
public override void OnException(ExceptionContext filterContext)
{
filterContext.Controller.TempData["UnhandledException"] = filterContext.Exception;
filterContext.ExceptionHandled = true;
((Controller)filterContext.Controller).ModelState.AddModelError(
((BussinessException)filterContext.Exception).Code.ToString(),
((BussinessException)filterContext.Exception).MessageToDisplay
);
filterContext.Result = new ViewResult
{
ViewName = this.View,
TempData = filterContext.Controller.TempData,
ViewData = filterContext.Controller.ViewData,
};
}
}
并且我将控制器操作放入
[HandleBussinessExceptionAttribute(Order = 2, ExceptionType = typeof(BussinessException), View = "Login")]
我也尝试过异常处理程序:
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(filterContext.RouteData));
然后使用ModelState.IsValid
处理错误,但要执行的值为null。所以现在我使用第一种方法。当我有更多的时间,我会尝试修复第二种方法。
答案 0 :(得分:2)
请阅读本部分的文档:
http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx
http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling
http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs
此处发布的内容太多:
public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is NotImplementedException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
}
}
你的控制器:
public class ProductsController : ApiController
{
[NotImplExceptionFilter]
public Contact GetContact(int id)
{
throw new NotImplementedException("This method is not implemented");
}
}
答案 1 :(得分:0)
根据this post,创建自定义活页夹并将模型放在TempData中:
public class AppBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext);
controllerContext.Controller.TempData["model"] = bindingContext.Model;
}
}
在global.asax中注册:
ModelBinders.Binders.DefaultBinder = new AppBinder();
创建一个BaseController并覆盖OnException:
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
this.ModelState.AddModelError(string.Empty, filterContext.Exception.Message);
filterContext.Result = new ViewResult
{
ViewName = filterContext.RouteData.Values["action"].ToString(),
TempData = filterContext.Controller.TempData,
ViewData = filterContext.Controller.ViewData
};
base.OnException(filterContext);
}
所有动作int继承自此基本控制器的控制器将在验证总结中显示其未处理的异常(记得有
@Html.ValidationSummary(true)
在页面中)。它适用于我,希望也适合你!