Nous avons récemment mis à niveau tous nos projets WebForms vers .NET 4.5 et nous avons rencontré un problème d’analyseur lors du chargement de pages avec un élément iFrame
. Nous avons corrigé cela en convertissant le iFrame
de HtmlGenericControl
en HtmlIframe
. Cela a corrigé toutes les erreurs de l'analyseur lorsque nous exécutons notre code localement.
Lorsque nous déployons l'application, nous obtenons le message d'erreur suivant:
Message d'erreur de l'analyseur: La classe de base inclut le champ 'frame', mais son type (System.Web.UI.HtmlControls.HtmlIframe) n'est pas compatible avec le type de contrôle (System.Web.UI.HtmlControls.HtmlGenericControl) **.
Lorsque je déploie l'ancien code avec la variable HtmlGenericControl
, l'erreur disparaît, ce qui suggère que, même si nous avons installé .NET 4.5, le serveur utilise toujours une version plus ancienne?
J'ai essayé de supprimer et de réinstaller .NET en m'assurant d'enregistrer asp avec IIS.
Windows 2008 R2 avec IIS 7.5 et .NET 4.5
Nous avons pu résoudre le problème en convertissant le
<iframe id="iframe" runat="server" />
à
<asp:HtmlIframe id="iframe" runat="server" />
Le problème de base est une incompatibilité entre l'objet généré à partir du contrôle de serveur Web Forms IFRAME par le compilateur ASP.NET (qui compile les fichiers ASPX et ASCX en code C # ou VB) et le type de la variable correspondant à ce contrôle. dans votre code Web Forms derrière. Un contrôle de serveur IFRAME (<iframe id="frame" runat="server" />
) sera analysé comme un contrôle d'un type particulier. Dans ASP.NET 4, un contrôle serveur IFRAME sera un contrôle HtmlGenericControl. Dans ASP.NET 4.5, un contrôle serveur IFRAME sera un contrôle HtmlIframe.
Le problème peut être résolu en s'assurant que l'attribut targetFramework sur l'élément de compilation dans votre fichier web.config est en accord avec la propriété Target Framework de votre projet et que la variable correspondant à votre contrôle serveur IFRAME correspond au type de contrôle ASP.NET. compilateur va générer.
Un projet ASP.NET 4 converti en .NET Framework 4.5 dans Visual Studio 2013 modifiera le fichier web.config du projet afin que l'attribut targetFramework de l'élément de compilation ait la valeur "4.5" (<compilation targetFramework="4.5"/>
). Cela entraîne le compilateur ASP.NET à traiter le contrôle serveur IFRAME comme un contrôle HtmlIframe. Cela peut poser un problème si la variable de contrôle située derrière le code Web Forms est toujours un HtmlGenericControl. L'erreur que vous voyez est comme ceci:
La classe de base inclut le champ 'frame', mais son type (System.Web.UI.HtmlControls.HtmlGenericControl) n'est pas compatible avec le type de contrôle (System.Web.UI.HtmlControls.HtmlIframe).
La solution à l'erreur précédente consiste à mettre à jour le type de variable de contrôle du serveur correspondant au contrôle de serveur IFRAME. Vous pouvez le faire en réenregistrant le fichier HTML Web Forms, ce qui entraînera la régénération du fichier de concepteur. Autant que je sache (dans Visual Studio 2013 au moins), il n'est pas nécessaire de modifier l'ID de contrôle. Si la variable de contrôle du serveur se trouve dans le code derrière le fichier, elle doit être mise à jour manuellement.
Un projet ASP.NET 4.5 dans lequel le code derrière la variable est une HtmlIframe rencontrera un problème similaire mais différent si l'attribut targetFramework de l'élément de compilation dans le fichier web.config a la valeur "4.0" (<compilation targetFramework="4.0"/>
). Ainsi, le compilateur ASP.NET considère le contrôle serveur IFRAME comme un contrôle HtmlGenericControl. L'erreur que vous voyez est comme ceci:
La classe de base comprend le champ 'frame', mais son type (System.Web.UI.HtmlControls.HtmlIframe) n'est pas compatible avec le type de contrôle (System.Web.UI.HtmlControls.HtmlGenericControl).
Pour résoudre l’erreur précédente, vous devez vous assurer que les paramètres de compilation web.config correspondent à l’attribut Target Framework de votre projet. Dans ce cas, l'attribut targetFramework de l'élément de compilation dans le fichier web.config doit avoir la valeur "4.5".
<compilation targetFramework="4.5"/>
Remarque: Définir l'attribut targetFramework de l'élément httpRuntime sur 4.5 aura également pour effet de définir l'attribut targetFramework de l'élément de compilation sur 4.5. Voir https://blogs.msdn.Microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/ pour plus d'informations.
Note 2: Il n'y a pas de balise <asp:HtmlIframe>
. L'enregistrement du préfixe de balise "asp" dans l'espace de noms System.Web.UI.HtmlControls n'est pas obligatoire pour utiliser un contrôle serveur IFRAME.
Vous devez ajouter la balise suivante:
<asp:HtmlIframe>
et dans le concepteur, modifiez le type de contrôle en:
System.Web.UI.HtmlControls.HtmlIframe
Ajoutez les éléments suivants dans le fichier Web.config:
<controls>
<add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" Assembly="System.Web"/>
</controls>
Cela devrait résoudre le problème.
Vérifiez que vous avez les prochains paramètres dans votre fichier de configuration. Assurez-vous également qu'il est là après la publication.
<system.web>
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5"/>
...
</system.web>
J'espère que ça devrait aider.
Vous pouvez conserver votre élément HTML en tant que <iframe>
et simplement modifier votre fichier .designer pour changer le type.
System.Web.UI.HtmlControls.HtmlIframe
Plus loin (ou comme une combinaison des réponses ici).
Je ne crois pas qu'il soit nécessaire de changer les balises de iframe
à asp:HtmlIFrame
si vous avez la référence au System.Web.UI.HtmlControls
mis à jour.
J'ai mis à jour mon web.config pour supprimer des versions spécifiques du préfixe de balise et le remplacer par:
<add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" Assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
Nettoyez et reconstruisez le projet et cela régénère toutes les balises de concepteur pour moi avec la sortie HtmlIFrame
correcte.
j'avais également fait face à ce problème mais j'ai simplement supprimé ce contrôle UserControl et ajouté un nouveau contrôle utilisateur avec le même nom, puis mon problème a été résolu .....
<iframe id="logPanel" runat="server" scrolling="auto" src="">
Examinez le fichier du concepteur et remplacez Htmliframe pour HtmlGenericControl dans le contrôle qui rencontre des problèmes.
À partir de .NET 4.5, Microsoft a décidé de remplacer l'iframe d'un HtmlGenericControl par son propre contrôle, un HtmlIframe. il faut donc changer le
System.Web.UI.HtmlControls.HtmlGenericControls to System.Web.UI.HtmlControls.HtmlIframe
Ma solution consistait simplement à renommer l'IFrame et à la reconstruire. Le fichier du concepteur sera mis à jour en conséquence avec les références correctes.