среда, 28 июля 2010 г.

ASP.NET MVC 2. Ошибка компиляции, или почему иногда не стоит надеяться на отладчик

Вчера во время компиляции моего проекта (ASP.NET MVC 2)возникла ошибка компиляции, а именно
CS0115: 'ASP.views_user_index_aspx.GetTypeHashCode()': не найден метод, пригодный для переопределения
Честно признаться, ошибки подобные этой происходят довольно часто (вначале, я думал именно так) и легко отлавливаются либо цепким взглядом разработчика, либо отладчиком.



С первым у меня вышел пролет, т.к. даже после отката всех изменений, внесенных в код, результат был тем же. Да и сами изменения были незначительными (добавлен новая функция в контроллер, добавлено новое поле в таблицу БД и добавлено новое представление). Отладчик, к полному моему разочарованию, тоже оказался бесполезен. По средству Intellitrace было установлено, что ошибка происходит где-то во внешнем коде (а именно во временных файлах, созданных при компиляции).

Попробовал удалить все содержимое Bin каталога и временные файлы из сообщения об ошибке, не помогло.

Попробовал создать новый проект и постепенно вносить в него мой код. Успешно подключил IoC (при отладке вылезало исключение именно от него, но это, конечно, просто внешние проявления), скопировал библиотеку, реализующую репозиторий для работы с БД, скопировал код из контроллеров в новый контроллер по умолчанию. Пока все работает. Переименовал класс и файл из HomeController в UserController. Возникла ошибка, похожая на изначальную.

Воспользовался Google, в русскоязычном секторе вообще ничего, на англоязычных упоминания о том, что подобная ошибка может возникать при переименовании файлов с кодом (хотя в изначально я файлы не переименовывал).

В конечном счете, решил создать новое представление для метода, на который жаловался компилятор (ASP.views_user_index_aspx.GetTypeHashCode()')
И тут я заметил, что в этом представлении есть одно отличие (за исключением того, что он пустой, конечно) от моего рабочего (т.е. нерабочего варианта)

В новом представлении было так

Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage"

А в старом вот так:

Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewUserControl"

Изменил этот кусок кода и все заработало. Видимо дело было в том, что я еще и заменил тип представления с Dinamic, на строготипизированное, а потом забыл про это. Хотя действительно странно, что такое действие вызывает столь трудно отлавливаемую ошибку.

2 комментария: