Перенос ASP.NET с 1.1 до 4.0: события не работают

Недавно я начал перенос проекта ASP.NET с .NET версии 1.1 на 4.0. Эта система в настоящее время работает на клиентском сайте и работает. Когда я переношу решение с помощью мастера VS, я не получаю никаких ошибок. Ошибка заключается в том, что нет событий управления сервером и всегда отображается пустое представление.

Я попытался явно установить ViewStateMode на Enabled и AutoEventWireup на true. К сожалению ничего не работает. Проект не написан как веб-приложение (преобразование не решает проблему).

Я также проверяю, установлены ли все идентификаторы сервера hav (они делают).

У проекта есть своя собственная система главной страницы, и на System.Web.UI.Page есть толстый слой, который может сломать много вещей, но до сих пор мне не удалось найти источник проблем.

Есть ли какой-то конкретный параметр, который я должен проверить (т.е. значения по умолчанию, измененные с .NET 1.1), или вы можете дать мне несколько советов, почему это может произойти?

EDIT 1: Это значения, которые публикуются при нажатии на LinkButton:

CRC= - 2134936892 & _EVENTTARGET= MPage% 24BC% 24TestButton & _EVENTARGUMENT= & _VIEWSTATE= & _EVENTVALIDATION =% 2FwEWAwL% 2BraDpAgLB49K8AwKy8rFAt4Axk3NlUEWxrtY% 2FRtaexH% 2F634CkJe6G9Im5EOPXtVw% 3D

ИЗМЕНИТЬ 2: Я внимательно изучил механизм пользовательской главной страницы, и я обнаружил, что он широко использует метод Server.Transfer(...) перед тем, как перейти на нужную страницу. Является ли это возможной причиной отсутствия ViewState? (тогда было бы странно, что EventTarget всегда сохраняется). И что еще более важно, могло ли быть какое-либо изменение между 1.1 и 4.0?

Ответы

Ответ 1

Вы проверили эту ссылку? http://www.asp.net/whitepapers/aspnet4/breaking-changes

Более подробно на странице указано, что когда действие FORM пустое, происходит следующее:

  • Страница ".aspx" отправляется в браузер с атрибутом действия элементов формы, установленным в "".
  • Форма отправляется обратно на ASP.NET.
  • Управляемый HTTP-модуль читает часть тела объекта. Например, модуль считывает Request.Form или Request.Params. Это заставляет тело объекта запроса POST считываться в управляемую память. В результате тело субъекта больше не доступно для каких-либо встроенных модулей кода, работающих в IIS 7 или IIS 7.5 Integrated mode.
  • Объект DefaultDocumentModule IIS в конечном итоге запускается и создает дочерний запрос к документу Default.aspx. Однако, поскольку тело сущности уже было прочитано частью управляемого кода, нет тела сущности, доступной для отправки дочернему запросу.
  • Когда HTTP-конвейер выполняется для дочернего запроса, обработчик для файлов .aspx выполняется во время этапа выполнения обработчика.
  • Поскольку нет тела сущности, нет переменных формы и состояния представления, поэтому для обработчика страницы .aspx для информации о том, какое событие (если оно есть) быть поднятым. В результате ни один из обработчиков событий postback для затронутой страницы .aspx не запускается. Вы можете обойти это поведение следующими способами:

EDIT: мы сталкиваемся с аналогичной проблемой при переносе на 3.5 два года назад... и то, что мы сделали, было использовать VS2005 с типом проекта Web App в качестве моста, поэтому наш путь миграции:

  • от 1.1 до 2.0
  • от 2.0 до 3.5

Это было наше последнее средство, и это было до выяснения этого документа.

Ответ 2

Это может или не может решить проблему, но если вы проверяете это сообщение в стеке Почему атрибут действия формы пуст на рабочем сервере? он говорит о нарушении изменение, введенное в ASP.NET 3.5 sp1, центрированное вокруг атрибута действия формы - это может быть место для начала!

Мне приходилось делать подобные вещи в прошлом, и это может быть кропотливый процесс, особенно когда у вас есть функция "custom masterpage" (я должен был сделать то же самое). Я бы выбрал действительно базовую страницу - у нас был BasePage, который был включен в CustomPage, который может быть унаследован администратором AdminBasePage, а затем на странице администратора и т.д. Если вы выберете относительно простую страницу и установите точку останова как можно раньше процесс построения страницы, а затем только F10 до тех пор, пока он не покажет, что он может показать, где вещи вызываются дважды (это было много в нашем случае и явилось причиной некоторых проблем со значениями, которые перезаписываются и т.д.).

В ответ на ваш вопрос server.transfer "Редактировать 2" я нашел этот ресурс http://www.codeproject.com/Tips/74472/ViewState-and-Server-Transfer-Best-practices, который объясняет, как обеспечить (надеюсь) что viewstate и server.transfer продолжают работать в гармонии. Я каждый день возвращаюсь к этому вопросу - делайте больше обновлений о том, как вы набираете обороты. У вас есть мое глубочайшее сочувствие!

Ответ 3

После завершения миграции

Если это веб-приложение:

Вот контрольный список:

  • Попробуйте изменить значения элементов управления сервера .NET в режиме разработки в Visual Studio 2010. (начиная с версии 4.0, вы будете использовать visual studio 2010). Изменение включает в себя: изменение размера серверное управление или любые другие свойства. Это заставит конструктор для создания серверного кода дизайнера.

  • Удостоверьтесь, что вы очистили решение и восстановили его. Раньше у меня были подобные проблемы, и они были исправлены после изменения дизайна от дизайнера, иногда давали бы ошибки. Во время миграции он не выдавал ошибок.

  • Сохраните форму и протестируйте ее.

  • Проверить использование Firebug в Firefox, есть ли javascript script при загрузке веб-страницы.

    Надеюсь, это было бы полезно.