从ViewComponent

时间:2017-11-23 11:14:32

标签: asp.net-mvc asp.net-core-mvc

我有一个错误视图,如果发生异常,应该加载它。错误视图位于:

Views / Shared / Error.cshtml(见附图)。

enter image description here

在我的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方法时,它会给我一个错误。

1 个答案:

答案 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,此过滤器将处理错误并显示错误页面。