从区域返回通用错误视图:如何使用控制器区域的 _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")
我有一个 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")