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

gam*_*isk 67 asp.net iis-7.5 windows-server-2008-r2

我们最近将所有WebForms项目升级到.NET 4.5,并在使用iFrame元素加载页面时遇到解析器问题.我们已经通过将iFramefrom 转换为HtmlGenericControl来纠正了这一点HtmlIframe.当我们在本地运行代码时,这已经纠正了所有解析器错误.

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

分析器错误消息:基类包括字段"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

Dav*_*ton 82

基本问题是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文件中的编译元素上的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窗体HTML文件来执行此操作,这将导致重新生成设计器文件.据我所知(至少在Visual Studio 2013中),不需要更改控件ID.如果服务器控件变量位于代码隐藏文件中,则必须手动更新.

如果web.config文件中的编译元素的targetFramework属性值为"4.0"(<compilation targetFramework="4.0"/>),则ASP.NET 4.5项目中的代码隐藏变量是HtmlIframe将遇到类似但不同的问题.这会导致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服务器控件所必需的.

  • 这句话的+1:"你可以通过重新保存Web窗体HTML文件来实现这一点,这将导致设计器文件被重新生成." 那是我们的解决方案. (14认同)
  • 出色的回应.重新保存aspx文件非常有效. (3认同)

小智 34

您需要添加以下标记:

<asp:HtmlIframe>
Run Code Online (Sandbox Code Playgroud)

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

System.Web.UI.HtmlControls.HtmlIframe
Run Code Online (Sandbox Code Playgroud)

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

<controls>
 <add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" assembly="System.Web"/>
</controls>
Run Code Online (Sandbox Code Playgroud)

这应该解决它.

  • 在将.NET 3.5项目升级到4.5之后,我错过了控件下的asp tagPrefix,它避免了*未知服务器标签'asp:HtmlIframe'.*解析器错误. (3认同)

gam*_*isk 20

我们能够解决转换问题的问题

<iframe id="iframe" runat="server" />
Run Code Online (Sandbox Code Playgroud)

<asp:HtmlIframe id="iframe" runat="server" />
Run Code Online (Sandbox Code Playgroud)

  • 答案没有提到你必须将命名空间'System.Web.UI.HtmlControls'添加到Web.config.(请参阅Panoj以获得完整答案). (7认同)

小智 6

检查配置文件中是否有下一个设置.还要确保发布后它就在那里.

<system.web>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5"/>
    ...
</system.web>
Run Code Online (Sandbox Code Playgroud)

希望它应该有所帮助.


p.c*_*ell 5

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

System.Web.UI.HtmlControls.HtmlIframe
Run Code Online (Sandbox Code Playgroud)

  • 似乎在保存 .ASPX 文件后它会恢复。 (2认同)