【发布时间】:2017-04-06 12:44:55
【问题描述】:
作为一种处理错误的包罗万象的方法,我将它添加到我的 MVC Web 应用程序的 BaseController 中。
public class BaseController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
_logger.Error(filterContext.Exception, "Website error page displayed.");
TempData["ErrorMessage"] = "Unspecified error - please contact support";
filterContext.RouteData.Values["controller"] = "Error";
filterContext.Result = new ViewResult
{
ViewName = "Error",
};
filterContext.ExceptionHandled = true;
}
}
我有一个专用的 ErrorController,如下所示:
public class ErrorController : BaseController
{
[AllowAnonymous]
public ActionResult Error()
{
string errorMessage = "There has been an error";
if(TempData["ErrorMessage"] != null)
{
errorMessage = TempData["ErrorMessage"].ToString();
}
Logger.Warn("Error error page displayed with message {0}", errorMessage);
ViewBag.ErrorMessage = errorMessage;
return View("Error");
}
}
当在应用程序的一部分中处理错误并将用户重定向到错误页面时,这可以正常工作:
if (!await UserManager.IsEmailConfirmedAsync(user.Id))
{
TempData["ErrorMessage"] = "You must have a confirmed email to log on.";
return RedirectToAction("Error", "Error");
}
但是,如果错误未处理并通过OnException 上的BaseController 路由,则错误视图按预期呈现,但控制器上的错误操作永远不会命中。错误消息采用默认值,并且操作中的断点不会被触发。
这是为什么?如何从OnException 正确调用控制器操作?
【问题讨论】:
-
检查this ?
-
@Berkay 这根本不是问题。 OnException 肯定会被调用。但是当它重定向到错误控制器时,不会调用错误操作。
-
您正在将 Result 属性设置为
ViewResult的实例,这将返回名称指定的视图。您可以通过在 `ViewName = "Error",. It should say that viewname is not found.中放置不同的视图名称来进行检查,您基本上需要做的是重定向到控制器Error的控制器操作ErrorController。 -
@ChetanRanpariya 当然这就是代码在做什么?行 filterContext.RouteData.Values["controller"] = "Error" 应该指向 ErrorController 而 ViewName 应该进入错误视图?
-
可能你得试试这种方式
filterContext.Result = this.RedirectToAction("Error", "Error");
标签: c# asp.net-mvc asp.net-mvc-4