Argh! Почему делает Систему. Сеть. Mvc. HandleErrorInfo передается моим представлениям?

Я собрал короткий Node.js отладочный праймер при использовании инспектора узла для тех, кто не уверен, с чего начать.

28
задан Chaddeus 4 January 2010 в 05:31
поделиться

1 ответ

Здесь - проблема в codeplex , объясняющая, почему возникает эта ошибка.

Цитата из http://web.archive.org/web/20131004122626/http://aspnet.codeplex.com/workitem/1795 , так как исходная ссылка не работает:

Атрибут HandleError не должен хранить информацию об исключении в ViewData.

Когда атрибут HandleError обрабатывает исключение, он сохраняет информацию об исключении в ViewData. Это проблема, когда Error.aspx наследуется от site.master, а класс site.master объявляется следующим образом.

public partial class Site : System.Web.Mvc.ViewMasterPage<SiteViewData>
{
}

SiteViewData содержит:

public class SiteViewData 
{
  public String Title { get; set; } 
}

Каждый класс страницы ViewData наследуется от класса SiteViewData и выглядит примерно так

public class IndexViewData : SiteViewData
{
  public String Message { get; set; }
  public String SupportedLanguages {get; set;}
}

Этот подход позволяет написать код на странице Site.Master следующим образом

<title><%= Html.Encode(ViewData.Model.Title) %></title>

К сожалению, когда выдается исключение, модель заменяется экземпляром класса HandleErrorInfo. Это вызывает выброс InvalidOperationException с информацией

Элемент модели, переданный в словарь, имеет тип System.Web.Mvc.HandleErrorInfo, но для этого словаря требуется элемент модели типа Igwt.Boh.Website.Web.Controllers.SiteViewData.

Можно ли добавить новое свойство ErrorData в класс ViewResult для хранения экземпляра класса HandleErrorInfo? Таким образом, ViewData не меняется.

Вполне вероятно, что любое исключение, возникшее в действии, произойдет после того, как свойства IndexViewDataSiteViewData) уже были инициализированы.

Закрыто 27 января 2010 в 00:24 по

Не исправлю - см. Комментарии.


Комментарии, упомянутые с помощью «wontfix», принадлежат бывшему члену команды Microsoft вместе с предложением обойти это (выделено жирным шрифтом):

К тому времени выполняется атрибут [HandleError], мы потеряли ссылку на исходный объект ActionResult. Мы даже не знаем, намеревались ли вы показать представление в любом случае - возможно, вы намеревались перенаправить. Часть конвейера (ViewResult), которая отвечала бы за передачу модели из контроллера в представление, исчезла.

Если возникает исключение, любая модель, над которой работало приложение, в любом случае должна рассматриваться как поврежденная или недоступная. Лучше всего было бы написать свое представление об ошибке таким образом, чтобы ни для него, ни для его зависимостей (например, его главной страницы) не требовалась исходная модель.

[Тысяча сто двадцать семь]
17
ответ дан Liam 14 October 2019 в 11:50
поделиться
Другие вопросы по тегам:

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