Как я передаю ViewData Представлению HandleError?

Я не уверен в WPF, но это может помочь. Я использовал решение, описанное в RegisterHotKey (user32) (измененный к моим потребностям, конечно) для приложения Windows Forms C# для присвоения комбинации КЛАВИШИ CTRL в рамках Windows для перевода в рабочее состояние формы C#, и это работало красиво (даже на Windows Vista). Я надеюсь, что это помогает и удачи!

14
задан Luc 25 November 2009 в 05:53
поделиться

1 ответ

Это связано с тем, что HandleErrorAttribute изменяет ViewData, передаваемый в представление при возникновении ошибки. Он передает экземпляр класса HandleErrorInfo с информацией об исключении, контроллере и действии.

Вы можете заменить этот атрибут на тот, который реализован ниже:

using System;
using System.Web;
using System.Web.Mvc;

public class MyHandleErrorAttribute : HandleErrorAttribute {

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }
        if (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled)
        {
            Exception innerException = filterContext.Exception;
            if ((new HttpException(null, innerException).GetHttpCode() == 500) && this.ExceptionType.IsInstanceOfType(innerException))
            {
                string controllerName = (string) filterContext.RouteData.Values["controller"];
                string actionName = (string) filterContext.RouteData.Values["action"];
                // Preserve old ViewData here
                var viewData = new ViewDataDictionary<HandleErrorInfo>(filterContext.Controller.ViewData); 
                // Set the Exception information model here
                viewData.Model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
                filterContext.Result = new ViewResult { ViewName = this.View, MasterName = this.Master, ViewData = viewData, TempData = filterContext.Controller.TempData };
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.Clear();
                filterContext.HttpContext.Response.StatusCode = 500;
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            }
        }
    }
}
20
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: