从区域返回通用错误视图:如何使用控制器区域的 _Layout 包装器?

Returning a generic error-view from an area: how to use the _Layout wrapper from the controller's area?

我有一个 BaseController 带有 errorview 功能,工作正常:

public ViewResult ErrorView(string error, string errormessage)
{
    ViewBag.ErrorType = error;
    ViewBag.ErrorMessage = errormessage;
    return View("~/Views/Shared/Error.cshtml");
}

从我的普通控制器扩展 BaseController 并调用此函数就像一个魅力。它将视图包装在 Views/Shared/_Layout.cshtml 中,一切都很好。

但是,当我从一个区域中扩展 basecontroller 的控制器调用此函数时,它还会将视图包装在 Views/Shared/_Layout.cshtml 而不是 Areas/MyArea/Views/Shared/_Layout.cshtml

如何在不为我的区域编写单独的 ErrorView 函数的情况下更改此行为?

这就是这些地区的问题。由于我不确定该框架是否可以推断出您所在的区域,因此我建议您这样做:

在您的 Area/Controllers 文件夹中添加一个 AreaBaseController,它将设置一个 属性 会告诉它。

在您的 BaseController 中:

public string Area { get; set; }

public ViewResult ErrorView(string error, string errormessage)
{
    ViewBag.ErrorType = error;
    ViewBag.ErrorMessage = errormessage;
    return View($"~/{Area}/Views/Shared/Error.cshtml");
}

在那个 AreaBaseController 中:

public AreaBaseController()
{
    Area = "MyArea";
}

您可能会更改 $"~/{Area}/ 部分,因为我没有尝试过,但它应该只需稍作更改即可。

希望对您有所帮助!

我找到了一个没有代码重复的工作解决方案

基础控制器

    protected virtual string GetErrorPath()
    {
        return "~/Views/Shared/Error.cshtml";
    }

    public ViewResult ErrorView(string error, string errormessage)
    {
        ViewBag.ErrorType = error;
        ViewBag.ErrorMessage = errormessage;
        return View(GetErrorPath());
    }

Area_BaseController : 基础控制器

    override protected string GetErrorPath() {
        return "~/Areas/MyArea/Views/Shared/Area_Error.cshtml";
    }

Area_Error.cshtml(空包装)

@Html.Partial("Error")