升级到.NET 4.5后的iFrame解析器错误


69

我们最近已将所有WebForms项目升级到.NET 4.5,并且在加载带有iFrame元素的页面时遇到解析器问题。我们已经通过的转换纠正了这个iFrameHtmlGenericControlHtmlIframe。当我们在本地运行代码时,这已纠正了所有解析器错误。

部署应用程序时,我们收到以下错误消息:

解析器错误消息:基类包含字段'frame',但是其类型(System.Web.UI.HtmlControls.HtmlIframe)与控件的类型(System.Web.UI.HtmlControls.HtmlGenericControl)不兼容。**

当我使用部署旧代码时,HtmlGenericControl错误消失了,这表明即使我们已安装.NET 4.5,服务器仍在使用旧版本?

我尝试删除并重新安装.NET,以确保向IIS注册ASP。

带有IIS 7.5和.NET 4.5的Windows 2008 R2

Answers:


87

基本问题是ASP.NET编译器(将ASPX和ASCX文件编译为C#或VB代码)从Web窗体IFRAME服务器控件生成的对象与Web窗体中与该控件相对应的变量类型之间不兼容后面的代码。IFRAME服务器控件(<iframe id="frame" runat="server" />)将被解析为特定类型的控件。在ASP.NET 4中,IFRAME服务器控件将是HtmlGenericControl控件。在ASP.NET 4.5中,IFRAME服务器控件将是HtmlIframe控件。

可以通过确保web.config文件中的collection元素上的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窗体代码仍然是HtmlGenericControl,则可能导致问题。您看到的错误是这样的:

基类包括字段“ frame”,但其类型(System.Web.UI.HtmlControls.HtmlGenericControl)与控件的类型(System.Web.UI.HtmlControls.HtmlIframe)不兼容。

解决上一个错误的方法是更新与IFRAME服务器控件相对应的服务器控件变量的类型。您可以通过重新保存Web Forms HTML文件来完成此操作,这将导致重新生成设计器文件。据我所知(至少在Visual Studio 2013中),无需更改控件ID。如果服务器控制变量在文件后面的代码中,则必须手动更新。

如果web.config文件中编译元素的targetFramework属性的值为“ 4.0”(<compilation targetFramework="4.0"/>),则变量后面的代码为HtmlIframe的ASP.NET 4.5项目将遇到类似但不同的问题。这导致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://blogs.msdn.microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/

注意2:没有<asp:HtmlIframe>标签。将标记前缀“ asp”注册到System.Web.UI.HtmlControls命名空间不是使用IFRAME服务器控件所必需的。


您知道是否<pages controlRenderingCompatibilityVersion="4.0"还会导致此问题?
2014年

在我的实验中,<pages controlRenderingCompatibilityVersion="4.0" />不影响ASP.NET编译器解析<iframe runat="server" />控件的方式(如果<compilation targetFramework="4.5"/>已设置)。
大卫·约翰斯顿

15
这句话的+1:“您可以通过重新保存Web Forms HTML文件来执行此操作,这将导致重新生成设计器文件。” 那就是我们的解决办法。
JamesQMurphy

@JamesQMurphy谢谢!
戴维·约翰斯顿

3
反应出色。重新保存aspx文件效果很好。
user1003916

34

您需要添加以下标签:

<asp:HtmlIframe>

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

System.Web.UI.HtmlControls.HtmlIframe

在Web.config中添加以下内容:

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

这应该解决它。


感谢您的输入,从上面接受的答案中可以看到,此问题已在不久前解决。
gambisk 2013年

3
将.NET 3.5项目升级到4.5之后,我在避免了未知服务器标签'asp:HtmlIframe'的控件下缺少了asp tagPrefix 解析器错误。
Daniel Ballinger 2014年

是否还有其他具有如此重大变化的控件?
Nelson Rothermel 2014年

20

我们能够解决将

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

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

7
答案没有提到您必须将名称空间'System.Web.UI.HtmlControls'添加到Web.config。(有关完整答案,请参见Panoj)。
2014年

1
或在特定的aspx文件中添加名称空间。
Tomasz Przychodzki '16

6

检查配置文件中是否有下一个设置。另外,请确保发布后它在那里。

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

希望对您有所帮助。


1
谢谢!我无意中删除了targetFramework="4.5"编译节点中的,以解决生产错误,然后开始在本地主机上收到此错误。这个答案救了我:)
Shiva


5

您可以将HTML元素保留为<iframe>,只需修改.designer文件以将类型更改为

System.Web.UI.HtmlControls.HtmlIframe

2
似乎在保存.ASPX文件后已将其还原。
Uwe Keim 2014年

2

进一步(或结合此处的答案)。

我认为iframeasp: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输出为我重新生成所有设计器标签。


2

我也遇到过这个问题,但是我只是删除了这个UserControl并添加了具有相同名称的新userControl,然后解决了我的问题.....

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



0

从.NET 4.5开始,Microsoft决定将iframe从HtmlGenericControl更改为自己的控件HtmlIframe。所以你必须改变

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

-1

我的解决方案是仅重命名IFrame并重新生成,然后使用正确的引用对设计器文件进行相应的更新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.