【问题标题】:Return shared view from ViewComponent从 ViewComponent 返回共享视图
【发布时间】: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


【解决方案1】:

第 1 步:- 创建自定义 ExpectionFilter 属性

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

【讨论】:

  • 我按照您的描述创建了两个类 CustomExpectionFilter 和 FilterConfig,并更改了我的 try-catch 方法。然后我用“throw new Exception()”模拟一个新的异常错误。然而,它给了我一个错误,在 catch-method 的行上,特别是在“throw;”上。 ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多