正在使用NLOG进行日志记录,并且发生日志的地方有单独的类@全局级别。根据要求,登录结束后必须从该类重定向到“错误”视图(Error.cshtml)。

但这是一个非控制器类,因此不能使用RedirectToAction()或简单地使用return View("Error")之类的常用方法。

有没有办法做到这一点?我尝试了Response.Redirect(),但是什么也没做。

HttpContext.Current.Response.Redirect("/Help/Error",true);


Error.cshtml是一个纯HTML文件,带有类似“错误”的文本,请联系Views/Shared/*文件夹下的admin。

日志记录类位于根文件夹下的单独文件夹(例如logging)中。

在对Action方法的每次调用中,如果发生任何异常,则记录器将自动被调用,这将完成日志记录,最后应重定向到错误视图。

最佳答案

您可以创建自己的基本控制器并处理onexception事件中的异常

public class BaseController : Controller
{
    protected override void OnException(ExceptionContext filterContext)
    {
       //Do your logging
       // and redirect / return error view
        filterContext.ExceptionHandled = true;
        // If the exception occured in an ajax call. Send a json response back
        // (you need to parse this and display to user as needed at client side)
        if (filterContext.HttpContext.Request.Headers["X-Requested-With"]=="XMLHttpRequest")
        {
            filterContext.Result = new JsonResult
            {
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                Data = new { Error = true, Message = filterContext.Exception.Message }
            };
            filterContext.HttpContext.Response.StatusCode = 500; // Set as needed
        }
        else
        {
            filterContext.Result = new ViewResult { ViewName = "Error.cshtml" };
            //Assuming the view exists in the "~/Views/Shared" folder
        }
    }
}


现在,对于其他控制器,从此bascontroller继承。

public class ProductsController : BaseController
{
   public ActionResult Die()
   {
     throw new Exception("I lost!");
   }
}


如果要重定向到Error操作方法(新的GET调用),则可以将ViewResult替换为RedirectToRouteResult

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary {
                                               {"controller", "Home"}, {"action", "Error"}
                                              };

关于c# - 是否可以从MVC中的非 Controller 类重定向到 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38947705/

10-12 12:21