【发布时间】:2017-11-24 05:18:55
【问题描述】:
我有一个错误视图,如果发生异常,应该加载它。错误视图位于:
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;
}
最后,我在控制器顶部添加了 [HandleException]:
[HandleException]
public class CustomerController : Controller
{
//All the actions...
}
为了模拟一个新的异常,我使用:
public IActionResult Device(string id, bool like, int type)
{
try
{
throw new Exception();
//code
return View(viewModel);
}
catch (Exception exe)
{
throw;
}
}
这似乎在控制器动作中起作用。如果它在 ViewComponent 中工作,我该如何模拟?当我执行相同的 try-catch 方法时,它会给我一个错误。
【问题讨论】:
-
为什么你要处理不在 ExceptionFilter 中的 Action Method 错误
-
什么意思?它是如何工作的?
-
看看this article 例如,章节 HandlerErrorAttribute。或者让谷歌为你搜索。
-
您应该处理包含视图组件(不是每个视图组件)的视图(操作方法)的错误。有一个全局异常处理程序来处理
OnException事件并从中返回您的错误视图/响应。 -
请查看我在问题中的最新编辑。
标签: asp.net-mvc asp.net-core-mvc