Ошибка парсера iFrame после обновления до.NET 4.5

Недавно мы обновили все наши проекты WebForms до.NET 4.5 и столкнулись с проблемой парсера при загрузке страниц с iFrame элемент. Мы исправили это путем преобразования iFrame от HtmlGenericControl в HtmlIframe, Это исправило все ошибки синтаксического анализатора, когда мы запускаем наш код локально.

При развертывании приложения мы получаем следующее сообщение об ошибке:

Сообщение об ошибке синтаксического анализатора: базовый класс включает поле frame, но его тип (System.Web.UI.HtmlControls.HtmlIframe) несовместим с типом элемента управления (System.Web.UI.HtmlControls.HtmlGenericControl).**

Когда я разверну старый код с HtmlGenericControl ошибка исчезает, предполагая, что, хотя мы установили.NET 4.5, сервер все еще использует более старую версию?

Я попытался удалить и переустановить.NET, чтобы убедиться, что зарегистрировать ASP в IIS.

Windows 2008 R2 с IIS 7.5 и.NET 4.5

9 ответов

Решение

Мы смогли решить проблему, преобразовав

<iframe id="iframe" runat="server" />

в

<asp:HtmlIframe id="iframe" runat="server" />

Основная проблема заключается в несовместимости объекта, сгенерированного из серверного элемента управления IFRAME веб-форм компилятором ASP.NET (который компилирует файлы ASPX и ASCX в код C# или VB), и типом переменной, соответствующей этому элементу управления, в веб-формах. код позади. Элемент управления сервера IFRAME (<iframe id="frame" runat="server" />) будет проанализирован как элемент управления определенного типа. В ASP.NET 4 серверный элемент управления IFRAME будет элементом управления HtmlGenericControl. В ASP.NET 4.5 серверный элемент управления IFRAME будет элементом управления HtmlIframe.

Эту проблему можно решить, убедившись, что атрибут targetFramework в элементе компиляции в вашем файле web.config согласуется со свойством Target Framework вашего проекта и что переменная, соответствующая вашему серверному элементу управления IFRAME, соответствует типу элемента управления ASP.NET. компилятор сгенерирует.

Проект ASP.NET 4, который был преобразован в.NET Framework 4.5 в Visual Studio 2013, изменит файл web.config проекта так, чтобы атрибут targetFramework элемента компиляции имел значение "4.5" (<compilation targetFramework="4.5"/>). Это заставляет компилятор ASP.NET обрабатывать серверный элемент управления IFRAME как элемент управления HtmlIframe. Это может вызвать проблему, если код веб-формы за управляющей переменной по-прежнему является HtmlGenericControl. Ошибка, которую вы видите, выглядит так:

Базовый класс включает поле frame, но его тип (System.Web.UI.HtmlControls.HtmlGenericControl) не совместим с типом элемента управления (System.Web.UI.HtmlControls.HtmlIframe).

Решение предыдущей ошибки заключается в обновлении типа серверной управляющей переменной, соответствующей серверному элементу управления IFRAME. Это можно сделать, повторно сохранив HTML-файл веб-форм, что приведет к регенерации файла конструктора. Насколько я вижу (по крайней мере в Visual Studio 2013), изменение идентификатора элемента управления не требуется. Если переменная управления сервером находится в коде файла, она должна быть обновлена ​​вручную.

Проект ASP.NET 4.5, в котором код за переменной представляет собой HtmlIframe, столкнется с аналогичной, но другой проблемой, если атрибут targetFramework элемента compilation в файле web.config имеет значение "4.0" (<compilation targetFramework="4.0"/>). Это заставляет компилятор ASP.NET обрабатывать серверный элемент управления IFRAME как элемент управления HtmlGenericControl. Ошибка, которую вы видите, выглядит так:

Базовый класс включает поле frame, но его тип (System.Web.UI.HtmlControls.HtmlIframe) не совместим с типом элемента управления (System.Web.UI.HtmlControls.HtmlGenericControl).

Чтобы исправить предыдущую ошибку, убедитесь, что параметры компиляции web.config соответствуют атрибуту Target Framework вашего проекта. В этом случае атрибут targetFramework элемента компиляции в web.config должен иметь значение "4.5".

<compilation targetFramework="4.5"/>


Примечание. Установка атрибута targetFramework элемента httpRuntime на 4.5 также приведет к установке атрибута targetFramework элемента компиляции на 4.5. См. https://blogs.msdn.microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/ для получения дополнительной информации.

Примечание 2: нет <asp:HtmlIframe> тег. Регистрация префикса тега "asp" в пространстве имен System.Web.UI.HtmlControls - это не то, что требуется для использования серверного элемента управления IFRAME.

Вам необходимо добавить следующий тег:

<asp:HtmlIframe>

и в конструкторе измените тип элемента управления на:

System.Web.UI.HtmlControls.HtmlIframe

Добавьте следующее в Web.config:

<controls>
 <add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" assembly="System.Web"/>
</controls>

Это должно это исправить.

Убедитесь, что у вас есть следующие настройки в вашем конфигурационном файле. Также убедитесь, что он там после публикации.

<system.web>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5"/>
    ...
</system.web>

Надеюсь, это должно помочь.

Вы можете сохранить свой HTML-элемент как <iframe>и просто измените файл.designer, чтобы изменить тип на

System.Web.UI.HtmlControls.HtmlIframe

Далее (или в качестве комбинации ответов здесь).

Я не верю, что на самом деле нужно менять теги iframe в asp:HtmlIFrame если у вас есть ссылка на обновленный System.Web.UI.HtmlControls,

Я обновил свой web.config, чтобы удалить определенные версии префикса тега и заменить его следующим:

<add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

Очистите и перестройте проект, и это восстановит все дизайнерские теги для меня с правильными HtmlIFrame выход.

Я также столкнулся с этой проблемой, но просто я удалил этот UserControl и добавил новый userControl с тем же именем, тогда моя проблема была исправлена ​​.....

  <iframe id="logPanel" runat="server" scrolling="auto" src="">

Просмотрите файл конструктора и замените Htmliframe на HtmlGenericControl в элементе управления, в котором возникли проблемы.

Начиная с.NET 4.5 Microsoft решила изменить iframe с HtmlGenericControl на свой собственный элемент управления, HtmlIframe. так что вы должны изменить

System.Web.UI.HtmlControls.HtmlGenericControls to System.Web.UI.HtmlControls.HtmlIframe

Мое решение состояло в том, чтобы просто переименовать IFrame и перестроить, и файл конструктора будет обновлен соответственно с правильными ссылками.

Другие вопросы по тегам