基本问题是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"
还会导致此问题?