69

我们最近将我们所有的 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

4

10 回答 10

88

基本问题是 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。如果服务器控制变量在代码隐藏文件中,则必须手动更新。

<compilation targetFramework="4.0"/>如果 web.config 文件中编译元素的 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 服务器控件所必需的。

于 2014-02-11T16:19:14.100 回答
35

您需要添加以下标签:

<asp:HtmlIframe>

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

System.Web.UI.HtmlControls.HtmlIframe

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

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

这应该解决它。

于 2013-11-21T13:27:03.393 回答
21

我们能够解决转换

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

<asp:HtmlIframe id="iframe" runat="server" />
于 2013-07-31T10:46:43.380 回答
7

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

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

希望它应该有所帮助。

于 2013-07-30T14:30:47.890 回答
6

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

System.Web.UI.HtmlControls.HtmlIframe
于 2014-08-05T16:21:25.823 回答
3

进一步(或作为此处答案的组合)。

如果您有对iframe更新的.asp:HtmlIFrameSystem.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输出为我重新生成所有设计器标签。

于 2014-09-03T12:33:53.357 回答
2

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

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

于 2014-11-17T09:08:06.323 回答
0

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

于 2015-04-23T22:12:27.043 回答
0

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

System.Web.UI.HtmlControls.HtmlGenericControls to System.Web.UI.HtmlControls.HtmlIframe
于 2019-05-21T14:15:42.640 回答
-1

我的解决方案是重命名 IFrame 并重建,设计器文件将使用正确的引用相应地更新。

于 2017-03-02T04:48:46.157 回答