2013-07-23 146 views
56

我們最近將所有WebForms項目升級到.NET 4.5,並且在使用iFrame元素加載頁面時遇到解析器問題。我們通過將iFrameHtmlGenericControl轉換爲HtmlIframe來糾正此錯誤。當我們在本地運行我們的代碼時,這已經糾正了所有的解析器錯誤。升級到.NET 4.5後iFrame分析器錯誤

當我們部署的應用,我們得到下面的錯誤消息:

分析器錯誤信息:基類包括字段「幀」,但它的類型(System.Web.UI.HtmlControls.HtmlIframe )不與控件的類型(System.Web.UI.HtmlControls.HtmlGenericControl)兼容。**

當我部署的舊代碼與HtmlGenericControl錯誤消失表明,即使我們已經安裝了。 NET 4.5,服務器仍在使用舊版本?

我試過刪除並重新安裝.NET,確保向IIS註冊asp。

的Windows 2008 R2與IIS 7.5和.NET 4.5

回答

18

我們能夠解決這個問題轉換

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

<asp:HtmlIframe id="iframe" runat="server" /> 
+6

答案沒有提到你必須添加命名空間'System.Web.UI.HtmlControls'到Web.config。 (請參閱Panoj以獲得完整答案)。 –

+0

或者在特定的aspx文件中添加命名空間。 –

6

檢查,你有你的配置文件下一個設置。還要確保它在發佈後在那裏。

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

希望它應該有所幫助。

+1

謝謝!我在編譯節點中無意中刪除了'targetFramework =「4.5」'來解決生產錯誤,然後開始在我的本地主機上得到這個錯誤。這個答案拯救了我:) – Shiva

29

您需要添加以下代碼:

<asp:HtmlIframe> 

,並在設計,更改控制類型爲:

System.Web.UI.HtmlControls.HtmlIframe 

添加以下在Web.config:

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

這應該修復它。

+0

感謝您的意見,從上述接受的答案中可以看出,此問題在前段時間已得到解決。 – gambisk

+3

將.NET 3.5項目升級到4.5後,我錯過了避免*未知服務器標籤'asp:HtmlIframe'。* Parser錯誤的控件下的asp tagPrefix。 –

+0

是否有任何其他控件具有這樣的突變變化? –

66

基本問題是由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,則會導致問題。您看到的錯誤是這樣的:

基類包含字段「框架」,但其類型(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"/>),則變量後面的代碼爲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的效果。有關更多信息,請參閱http://blogs.msdn.com/b/webdev/archive/2012/11/19/all-about-httpruntime-targetframework.aspx

注2:沒有<asp:HtmlIframe>標籤。將標記前綴「asp」註冊到System.Web.UI.HtmlControls命名空間不是使用IFRAME服務器控件所必需的。

+0

您是否知道' crush

+0

在我的實驗,'<頁面controlRenderingCompatibilityVersion = 「4.0」/>'不影響ASP.NET編譯器如何解析一個'