升级到.NET 4.5后,iFrame解析器出错

70
我们最近将所有WebForms项目升级到.NET 4.5,并在加载带有iFrame元素的页面时遇到解析器问题。我们通过将iFrameHtmlGenericControl转换为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
11个回答

90
基本问题是Web Forms IFRAME服务器控件生成的对象与Web Forms代码后台中该控件对应的变量类型之间不兼容。一个IFRAME服务器控件(<iframe id="frame" runat="server" />)将被解析为特定类型的控件。在ASP.NET 4中,IFRAME服务器控件将是HtmlGenericControl控件。在ASP.NET 4.5中,IFRAME服务器控件将是HtmlIframe控件。
问题可以通过确保web.config文件中compilation元素上的targetFramework属性与项目的Target Framework属性一致,并且与IFRAME服务器控件相对应的变量与ASP.NET编译器将生成的控件类型匹配来解决。
在Visual Studio 2013中将已转换为.NET Framework 4.5的ASP.NET 4项目将修改项目的web.config文件,使编译元素的targetFramework属性具有“4.5”值(<compilation targetFramework="4.5"/>)。这会导致ASP.NET编译器将IFRAME服务器控件视为HtmlIframe控件。如果Web Forms代码后台控制变量仍为HtmlGenericControl,则可能会出现问题。您所看到的错误如下:
基类包括字段'frame',但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件类型(System.Web.UI.HtmlControls.HtmlIframe)不兼容。
解决前一个错误的方法是更新与IFRAME服务器控件对应的服务器控件变量的类型。您可以通过重新保存Web Forms HTML文件来实现这一点,这将导致设计文件被重新生成。据我所见(至少在Visual Studio 2013中),更改控件ID是不必要的。如果服务器控件变量在代码后台文件中,则必须手动更新。如果ASP.NET 4.5项目的代码实现变量是HtmlIframe,则当web.config文件中编译元素的targetFramework属性的值为“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属性一致。在这种情况下,web.config中的编译元素的targetFramework属性应该为“4.5”。 <compilation targetFramework="4.5"/> 注意:将httpRuntime元素的targetFramework属性设置为4.5也会将编译元素的targetFramework属性设置为4.5。有关更多信息,请参见https://devblogs.microsoft.com/dotnet/all-about-httpruntime-targetframework/
注意2:没有<asp:HtmlIframe>标记。注册标记前缀“asp”到System.Web.UI.HtmlControls命名空间不是使用IFRAME服务器控件所必需的。

你知道 <pages controlRenderingCompatibilityVersion="4.0" 是否也可能导致这个问题吗? - crush
15
+1 对于这句话:"You can do this by re-saving the Web Forms HTML file which will cause the designer file to be regenerated." 这是我们的解决方法。您可以通过重新保存Web表单HTML文件来实现此操作,这将导致设计文件重新生成。 - JamesQMurphy
3
回答非常好。重新保存aspx文件完美解决了问题。 - cowsay
简而言之,只需删除iframe标签,保存文件,粘贴回去,再次保存 - 设计师应该会被正确地重新生成。 - drizin
运行得很顺利!这应该是被采纳的答案。 - Shamshiel
显示剩余2条评论

34
你需要添加以下标签:
<asp:HtmlIframe>

在设计师中,将控件类型更改为:

System.Web.UI.HtmlControls.HtmlIframe
在Web.config文件中添加以下内容:
<controls>
 <add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" assembly="System.Web"/>
</controls>

这应该解决它。


感谢您的反馈。正如您从上面接受的答案中所看到的,这个问题已经在一段时间前得到了解决。 - gambisk
3
将.NET 3.5项目升级到4.5后,控件下缺少了asp tagPrefix,导致出现“Unknown server tag 'asp:HtmlIframe'”解析器错误。请帮我翻译此内容。 - Daniel Ballinger
还有其他控件像这样有破坏性变化吗? - Nelson Rothermel

20

我们已经成功修复了转换问题

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

7
回答没有提到你必须将命名空间'System.Web.UI.HtmlControls'添加到Web.config中(请参见Panoj的完整答案)。 - Captain Sensible
1
或者在特定的aspx文件中添加命名空间。 - Tomasz Przychodzki

7

请检查您的配置文件中是否有以下设置。确保在发布后仍存在。

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

希望这可以帮助您。

1
谢谢!我无意中删除了编译节点中的 targetFramework="4.5" 以解决生产错误,然后在本地主机上开始出现此错误。这个答案救了我 :) - Shiva
https://briancaos.wordpress.com/2013/08/07/system-web-ui-htmlcontrols-htmliframe-is-not-compatible-with-the-type-of-control-system-web-ui-htmlcontrols-htmlgenericcontrol/ - Praveen Kumar Rejeti

6
您可以保留HTML元素作为<iframe>,只需修改.designer文件以更改类型即可。
System.Web.UI.HtmlControls.HtmlIframe

3
保存 .ASPX 文件后,似乎会恢复为先前的状态。 - Uwe Keim

3

进一步地(或者作为这里回答的组合),我认为如果你有更新的 System.Web.UI.HtmlControls 的引用,实际上不需要将标签从 iframe 更改为 asp:HtmlIFrame

我更新了我的 web.config 文件,删除了特定版本的标签前缀并替换为:

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

清理并重新构建项目,这将为我重新生成所有设计标签,并使用正确的 HtmlIFrame 输出。


2
我也遇到了这个问题,但是我只是删除了这个UserControl,并添加了一个同名的新UserControl,然后我的问题就解决了...
  <iframe id="logPanel" runat="server" scrolling="auto" src="">


0
对我有效的方法如下:
- 删除/注释掉框架。 - 编译/运行应用程序。 - 添加/取消注释框架。 - 再次运行应用程序。
设计者.cs文件中的行自动更改为: protected global::System.Web.UI.HtmlControls.HtmlIframe fPdf;

0
查看设计文件,将存在问题的控件中的Htmliframe替换为HtmlGenericControl。

你的意思是相反的,用Htmliframe替换HtmlGenericControl。 - Tomasz Przychodzki

0
从.NET 4.5开始,微软决定将iframe从HtmlGenericControl更改为其自己的控件,即HtmlIframe。 因此,您需要更改


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接