基本问题是 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 服务器控件所必需的。