web-dev-qa-db-fra.com

L’élément de modèle passé dans le dictionnaire est de type 'mvc.Models.ModelA' mais ce dictionnaire nécessite un élément de modèle de type

J'ai cette erreur agaçante dans certaines de mes versions. 

Il n'y a pas d'erreur dans le projet, car si je compile à nouveau, le problème disparaît. Le message ne s'affiche que lorsque le site est déployé sur un serveur Windows 2008. 

J'ai d'abord pensé qu'il pouvait s'agir d'un problème avec les fichiers temporaires, mais ce n'est pas le cas. J'ai déployé la construction sur un site Web différent et l'erreur persiste. 

L'erreur apparaît sur des actions aléatoires du site. La plupart du temps, les versions sont correctes, mais chaque 3e ou 4e génération génère des erreurs d'exécution.

Je construis en utilisant un WebdeploymentProject en mode release. Les vues sont précompilées.

Ce n'est pas Dans ASP.NET MVC, une erreur de type incorrect s'est produite lors du rendu d'une page avec le bon objet typé , car les vues portent des noms totalement différents.

Comment puis-je déboguer ce problème ou comment obtenir de l'aide pour cela?

Voici mon projet de déploiement Web

    <!-- 
      Microsoft Visual Studio 2008 Web Deployment Project 
      http://go.Microsoft.com/fwlink/?LinkID=104956

    -->
    <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <ProductVersion>9.0.21022</ProductVersion>
        <SchemaVersion>2.0</SchemaVersion>
        <ProjectGuid>{E5E14CEB-0BCD-4203-9A5A-34ABA9C717EA}</ProjectGuid>
        <SourceWebPhysicalPath>..\B2CWeb</SourceWebPhysicalPath>
        <SourceWebProject>{3E632DB6-6DB3-4BD0-8CCA-12DE67165B48}|B2CWeb\B2CWeb.csproj</SourceWebProject>
        <SourceWebVirtualPath>/B2CWeb.csproj</SourceWebVirtualPath>
        <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <DebugSymbols>true</DebugSymbols>
        <OutputPath>.\Debug</OutputPath>
        <EnableUpdateable>false</EnableUpdateable>
        <UseMerge>true</UseMerge>
        <SingleAssemblyName>B2CWeb_Build</SingleAssemblyName>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <DebugSymbols>false</DebugSymbols>
        <OutputPath>..\B2CWeb_Deploy\</OutputPath>
        <EnableUpdateable>false</EnableUpdateable>
        <UseMerge>true</UseMerge>
        <SingleAssemblyName>B2C_Web</SingleAssemblyName>
        <ContentAssemblyName>
        </ContentAssemblyName>
        <DeleteAppCodeCompiledFiles>false</DeleteAppCodeCompiledFiles>
      </PropertyGroup>
      <ItemGroup>
      </ItemGroup>
      <Import Project="$(MSBuildExtensionsPath)\Microsoft\WebDeployment\v9.0\Microsoft.WebDeployment.targets" />
      <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
           Other similar extension points exist, see Microsoft.WebDeployment.targets.
      <Target Name="BeforeBuild">
      </Target>
      <Target Name="BeforeMerge">
      </Target>
      <Target Name="AfterMerge">
      </Target>
      <Target Name="AfterBuild">
      </Target>
      -->
    </Project>

MODIFIER

Après quelques mois, ce problème a disparu. Je n'ai pas eu de problèmes depuis plus d'un an maintenant. Je suppose que le problème va frapper à nouveau lorsque personne ne s'y attend.

EDIT 2

… Depuis plus de 2 ans maintenant. Je suis un mec tellement chanceux!

EDIT 3

Je viens de lire un article sur MSDN , et cela ressemble au problème que j'ai eu. Le débogage est désactivé, mais la compilation était "parfois incorrecte". Le comportement de l'ancien fournisseur pourrait être le problème. Mais c'est juste deviner.

Les très grandes pages contenant de longues périodes de HTML sans bloc serveur (par exemple <% =%>) peuvent provoquer un débordement de pile lorsque la compilation de débogage est activée, ce qui provoque le blocage de l'application. Notez que lors de nos tests, il a fallu une page environ 4 fois plus grande qui aurait provoqué un problème similaire avec l'ancien fournisseur, mais dans ce cas, l'application est bloquée dans son intégralité, alors

70
Mathias F

Même si les types correspondent, vous pouvez obtenir cette erreur lorsqu'une valeur NULL est transmise à une vue partielle.

Vous pouvez résoudre ce problème en appelant RenderPartial avec une ViewDataDictionary vide comme ceci:

helper.RenderPartial("~/Views/Player/PlayerName.ascx", player, new ViewDataDictionary());

Pour référence, j'ai trouvé cette solution chez:
renderpartial avec le modèle null reçoit le mauvais type

174
Maslow

Partiels ASP.NET MVC

Le modèle NULL a été adopté !!!

@Html.Partial("PartialView", model: Model)
14
Andrei

Cette erreur peut se produire (et se produit) en cas d'incompatibilité entre les données fournies par la méthode d'action du contrôleur à la vue et le type de données attendu par la vue. Cela n'apparaîtra normalement pas comme une erreur de construction, même avec les vues précompilées.

Par exemple, si j'ai une méthode ...

public ActionResult Create()
{
    // Do something
    return View(new CustomerCreateViewModel());
}

... et une vue Créer avec un attribut de page ...

<%@ Page ... Inherits="System.Web.Mvc.ViewPage<CustomerDetailsViewModel>" %>

... cela va compiler et construire sans erreur. Cependant, lorsque j'appelle l'action Create, un écran jaune s'affiche, car la méthode Create crée des données d'un type et que la vue attend des données d'un type différent. Vous voudrez peut-être vérifier que vos types correspondent bien ...

7
Neil T.

Êtes-vous absolument sûr que cela n'a rien à voir avec les données transmises à la vue? Effectuez-vous une reconstruction complète à chaque fois?

Ces erreurs se produisent généralement lorsqu'une vue partielle tente d'utiliser le modèle de vue transmis à ViewPage lorsque le modèle de vue transmis à la vue partielle est null. Je me rends compte que vous sous-entendez que l'erreur est en quelque sorte causée par le processus de construction, mais je ne vois pas comment cela serait possible. Est-il possible que le site déployé utilise une base de données différente de celle du site que vous exécutez sur votre ordinateur de développement, et les données (ou le manque de données) de cette base de données pourraient-elles être à l'origine du problème?

3
Rune

La construction déclenche-t-elle des avertissements ou des erreurs?

Avez-vous vos dépendances correctement configurées? Par exemple. vues selon les modèles. Construisez des chiffres dans quel ordre pour compiler des choses en regardant les dépendances spécifiées. Par exemple. Si vous modifiez un modèle et que la vue est compilée avant le modèle, vous rencontrez des problèmes ...

Est-ce que cela disparaît si vous ne compilez pas de vues?

De plus, vos vues héritent-elles de System.Web.Mvc.ViewPage ou System.Web.Mvc.ViewPage<T> où T est votre modèle?

2
svinto

Avant d’affecter le modèle à la commande usercontrol à partir de votre vue, instanciez cet objet dans le constructeur du modèle/entité.

Exemple:

 public class MainEntity
 {
    public SubEntity AssociatedEntity;

    public MainEntity()
    {
        // This is where the instantiation happen.
        AssociatedEntity = new SubEntity(); 
    }
 }

 public class SubEntity
 {
    public string property1;
 }

Votre page de vue:

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<MyNamespace.Models.MainEntity>" %>
....
<%Html.RenderPartial("ucMyUserControl",Model.AssociatedEntity);
....

Votre contrôle utilisateur:

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<MyNamespace.Models.SubEntity>" %>
....
<%Html.TextBoxFor(m=>m.Property1);
1
Siva Gopal

Si vous avez un dossier Vues de remplacement, dans lequel il existe plusieurs partiels du même nom (un remplaçant les autres avec le même nom), veillez à mettre à jour le type de modèle sur chaque vue, sinon cette erreur risque de se produire.

0
cat5dev

J'ai eu le message d'erreur suivant

L'élément de modèle passé dans le dictionnaire est de type 'System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]', mais ce dictionnaire nécessite un élément de modèle de type "System.Collections.Generic.List1 [MyProject.Models.B]".

avec le code suivant

IEnumerable<B> list_B;
...
IEnumerable<A> list_A = Repo.GetListOfType_A();
list_B = list_A.Select(x => new B { Number = x.Number, Name = x.Name });
...
return View(list_B);

et je ne sais pas quel était le type 

System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]

de toute façon, l'erreur disparaît quand j'ajoute un .ToList() à la fin

IEnumerable<B> list_B;
...
IEnumerable<A>list_A = Repo.GetListOfType_A();
list_B = list_A.Select(x => new B { Number = x.Number, Name = x.Name }).ToList(); // here
...
return View(list_B);

J'espère que ça aide quelqu'un d'autre

0
Enrique Zavaleta

Pour moi, cela a été causé par une erreur de copier/coller stupide dans mon contexte. Je recevais cette erreur sur mon index de contact.

    public DbSet<Customer> Customer { get; set; }
    public DbSet<Customer> Contact { get; set; }
    // Note this ^^^^^^^^ should have been Contact

Il compile bien, mais m'a donné l'erreur en essayant de rendre la vue.

(Ajouter ceci comme quelque chose d'autre pour les futurs gens à la recherche de solutions à essayer.)

0
danielc