我们最近将所有WebForms项目升级到.NET 4.5,并在加载具有iFrame
元素的页面时遇到解析器问题。我们已将iFrame
从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
答案 0 :(得分:80)
基本问题是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”({{1} })。这会导致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”({{1},那么后面的变量代码是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:没有<compilation targetFramework="4.0"/>
标签。将标记前缀“asp”注册到System.Web.UI.HtmlControls命名空间不是使用IFRAME服务器控件所必需的。
答案 1 :(得分:33)
您需要添加以下标记:
<asp:HtmlIframe>
并在设计器中将控件类型更改为:
System.Web.UI.HtmlControls.HtmlIframe
在Web.config中添加以下内容:
<controls>
<add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" assembly="System.Web"/>
</controls>
这应该解决它。
答案 2 :(得分:20)
我们能够解决转换
的问题<iframe id="iframe" runat="server" />
到
<asp:HtmlIframe id="iframe" runat="server" />
答案 3 :(得分:6)
检查配置文件中是否有下一个设置。还要确保发布后它就在那里。
<system.web>
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5"/>
...
</system.web>
希望它有所帮助。
答案 4 :(得分:4)
您可以将HTML元素保留为<iframe>
,只需修改.designer文件即可将类型更改为
System.Web.UI.HtmlControls.HtmlIframe
答案 5 :(得分:2)
进一步(或作为这里答案的组合)。
如果您引用了更新后的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
输出为我重新生成所有设计器标签。
答案 6 :(得分:1)
我也遇到过这个问题,但我只是删除了这个UserControl,并添加了同名新的userControl,然后我的问题得到了修复......
<iframe id="logPanel" runat="server" scrolling="auto" src="">
答案 7 :(得分:0)
查看设计器文件,并在有问题的控件中替换HtmlFrame用于HtmlGenericControl。
答案 8 :(得分:0)
我的解决方案是重命名IFrame并重建,设计器文件将使用正确的引用进行相应更新。
答案 9 :(得分:0)
从.NET 4.5开始,Microsoft决定将iframe从HtmlGenericControl更改为自己的控件HtmlIframe。 所以您必须更改
System.Web.UI.HtmlControls.HtmlGenericControls to System.Web.UI.HtmlControls.HtmlIframe