Ошибка парсера 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 и перестроить, и файл конструктора будет обновлен соответственно с правильными ссылками.