web-dev-qa-db-ja.com

.NET 4.5へのアップグレード後のiFrameパーサーエラー

最近、すべてのWebFormsプロジェクトを.NET 4.5にアップグレードし、iFrame要素を持つページを読み込むときにパーサーの問題が発生しました。 iFrameHtmlGenericControlからHtmlIframeに変換することでこれを修正しました。これにより、コードをローカルで実行する際のすべてのパーサーエラーが修正されました。

アプリをデプロイすると、次のエラーメッセージが表示されます。

パーサーエラーメッセージ:基本クラスにはフィールド 'frame'が含まれていますが、そのタイプ(System.Web.UI.HtmlControls.HtmlIframe)はコントロールのタイプ(System.Web.UI.HtmlControls.HtmlGenericControl)と互換性がありません。**

HtmlGenericControlを使用して古いコードをデプロイすると、.NET 4.5をインストールしたにもかかわらず、サーバーが古いバージョンを使用していることを示唆するエラーが消えますか?

.NETを削除して再インストールし、aspをIISに登録するようにしました。

IIS 7.5および.NET 4.5を使用するWindows 2008 R2

66
gambisk

変換の問題を修正できました

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

<asp:HtmlIframe id="iframe" runat="server" />
20
gambisk

基本的な問題は、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プロジェクトは、コンパイル要素のtargetFramework属性の値が「4.5」(<compilation targetFramework="4.5"/>)になるようにプロジェクトのweb.configファイルを変更します。これにより、ASP.NETコンパイラはIFRAMEサーバーコントロールをHtmlIframeコントロールとして扱います。コントロール変数の背後にあるWebフォームのコードがまだHtmlGenericControlである場合、これが問題を引き起こす可能性があります。表示されるエラーは次のとおりです。

基本クラスにはフィールド「frame」が含まれていますが、そのタイプ(System.Web.UI.HtmlControls.HtmlGenericControl)はコントロールのタイプ(System.Web.UI.HtmlControls.HtmlIframe)と互換性がありません。

前のエラーの解決策は、IFRAMEサーバーコントロールに対応するサーバーコントロール変数のタイプを更新することです。これを行うには、WebフォームHTMLファイルを再保存します。これにより、デザイナーファイルが再生成されます。私が見る限り(少なくともVisual Studio 2013では)、コントロールIDを変更する必要はありません。サーバー制御変数がコードビハインドファイルにある場合は、手動で更新する必要があります。

変数の背後にあるコードがHtmlIframeであるASP.NET 4.5プロジェクトでは、web.configファイルのコンパイル要素のtargetFramework属性の値が「4.0」(<compilation targetFramework="4.0"/>)の場合、同様の問題が発生します。これにより、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>タグはありません。 System.Web.UI.HtmlControls名前空間にタグプレフィックス "asp"を登録することは、IFRAMEサーバーコントロールを使用するために必要なものではありません。

80
David Johnston

次のタグを追加する必要があります。

<asp:HtmlIframe>

デザイナーで、コントロールタイプを次のように変更します。

System.Web.UI.HtmlControls.HtmlIframe

Web.configに次を追加します。

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

これで修正されるはずです。

34
Panoj

設定ファイルに次の設定があることを確認してください。また、公開後にそれが存在することを確認してください。

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

それが役立つことを願っています。

6

HTML要素を<iframe>のままにして、.designerファイルを変更して、タイプを

System.Web.UI.HtmlControls.HtmlIframe
4
p.campbell

さらに(またはここでの回答の組み合わせとして)。

更新されたasp:HtmlIFrameへの参照がある場合、実際にタグをiframeから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出力を使用してすべてのデザイナータグが再生成されます。

2
dougajmcdonald

私もこの問題に直面していましたが、このUserControlを削除し、同じ名前の新しいuserControlを追加しただけで問題が修正されました.....

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

デザイナーファイルを調べて、問題のあるコントロールのHtmlGenericControlのHtmliframeを置き換えます。

0
ovamendocino

.NET 4.5から、MicrosoftはiframeをHtmlGenericControlから独自のコントロールであるHtmlIframeに変更することを決定しました。あなたが変更する必要があります

System.Web.UI.HtmlControls.HtmlGenericControls to System.Web.UI.HtmlControls.HtmlIframe
0
Ayush joshi

私の解決策は、IFrameの名前を変更して再構築するだけで、デザイナーファイルは適切な参照で更新されます。

0
De Wet Ellis