我有一个错误视图,如果发生异常,应该加载它。错误视图位于:
Views / Shared / Error.cshtml(见附图)。
在我的Controller中,我的try-and catch看起来像这样:
public IActionResult Device(string id, bool like, int type)
{
try
{
//code
return View(viewModel);
}
catch (Exception exe)
{
return View("Error", exe);
}
}
这样可以显示正确的错误视图。但是,我有一个ViewComponent,它应该显示相同的错误视图。
我尝试了以下内容:
1)复制错误文件并将其粘贴到与我的ViewComponent相同的文件夹中(在默认视图下方)。这不会给我一个错误,但默认视图是正在加载的。
2)我已通过以下方式从共享文件夹返回错误视图:
return View("../../../Shared/Error");
这也不会给出错误,但默认视图是正在加载的视图。
关于如何解决这个问题的任何想法?
到目前为止,我已经创建了一个新类
public class HandleExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
var result = new ViewResult { ViewName = "Error" };
var modelMetadata = new EmptyModelMetadataProvider();
result.ViewData = new ViewDataDictionary(
modelMetadata, context.ModelState);
result.ViewData.Add("HandleException",
context.Exception);
context.Result = result;
context.ExceptionHandled = true;
}
}
在我的错误视图中,我添加了这个:
@{
ViewData["Title"] = "Error";
Layout = "_LayoutCustomer";
Exception ex = ViewData["HandleException"] as Exception;
}
最后,我在Controller上添加了[HandleException]:
[HandleException]
public class CustomerController : Controller
{
//All the actions...
}
为了模拟一个新的Exception,我使用:
public IActionResult Device(string id, bool like, int type)
{
try
{
throw new Exception();
//code
return View(viewModel);
}
catch (Exception exe)
{
throw;
}
}
这似乎适用于Controller-actions。如何在ViewComponent中模拟它是否可以模拟?当我使用相同的try-catch方法时,它会给我一个错误。
答案 0 :(得分:0)
步骤1: - 创建自定义ExpectFilter属性
public class CustomExpectionFilter : IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Error.cshtml"
};
}
}
步骤2: - 在FilterConfig中注册CustomExpectionFilter
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomExpectionFilter());
}
}
第3步: - 改变
public IActionResult Device(string id, bool like, int type)
{
try
{
//code
return View(viewModel);
}
catch (Exception)
{
throw;
}
}
现在,当应用程序发生错误时,它将调用CustomExpection Filter,此过滤器将处理错误并显示错误页面。