Das an das Wörterbuch übergebene Modellelement ist vom Typ 'mvc.Models.ModelA', für dieses Wörterbuch ist jedoch ein Modellelement vom Typ 'mvc.Models.ModelB' erforderlich.

70

Ich habe diesen nervigen Fehler in einigen meiner Builds.

Es gibt keinen Fehler im Projekt, denn wenn ich erneut erstelle, verschwindet das Problem. Die Meldung wird nur angezeigt, wenn die Site auf einem Windows 2008-Server bereitgestellt wird.

Ich dachte zuerst, dass es ein Problem mit temporären Dateien sein könnte, aber das ist nicht der Fall. Ich habe den Build in einem anderen Web bereitgestellt und der Fehler wird weiterhin angezeigt.

Der Fehler tritt bei zufälligen Aktionen der Site auf. Die meisten Builds sind in Ordnung, aber jeder 3. oder 4. Build führt zu Laufzeitfehlern.

Ich erstelle mit einem WebdeploymentProject im Release-Modus. Ansichten werden vorkompiliert.

Es ist nicht in ASP.NET MVC ich einen falschen Typen Fehler auftreten , wenn eine Seite mit der richtigen typisierten Objekt - Rendering , weil Ansichten völlig unterschiedliche Namen haben.

Wie kann ich dieses Problem beheben oder wie kann ich Hilfe dafür erhalten?

Hier ist mein WebDeploymentProject

    <!-- 
      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>

BEARBEITEN

Nach einigen Monaten verschwand dieses Problem. Ich habe seit über 1 Jahr keine Probleme mehr. Ich denke, das Problem wird erneut auftreten, wenn niemand damit rechnet.

BEARBEITEN 2

… Seit über 2 Jahren. Ich bin so ein Glückspilz!

BEARBEITEN 3

Ich habe gerade einen Artikel über MSDN gelesen und es klingt nach dem Problem, das ich hatte. Ich habe das Debuggen deaktiviert, aber die Kompilierung war "manchmal falsch". Das Verhalten des alten Anbieters könnte das Problem sein. Aber das ist nur eine Vermutung.

Sehr große Seiten mit langen HTML-Bereichen ohne Serverblöcke (z. B. <% =%>) können einen Stapelüberlauf verursachen, wenn die Debug-Kompilierung aktiviert ist, die die Anwendung zum Absturz bringt. Beachten Sie, dass in unseren Tests eine Seite verwendet wurde, die ~ 4x so groß ist, dass beim alten Anbieter ein ähnliches Problem aufgetreten wäre. In diesem Fall stürzt jedoch die gesamte Anwendung ab, während beim alten Anbieter die fehlerhafte Seite nur fehlschlägt

Mathias F.
quelle
Können Sie bestätigen, dass dies etwas mit dem Erstellungsprozess zu tun hat? Es klingt für mich eher nach einem Codierungsfehler. Haben Sie versucht, die Ausnahme zu verfolgen?
Johannes Rudolph
Kann der Stack-Trace und der Code am Ort der Ausnahme bereitgestellt werden?
Madaboutcode
@Johannes: Es ist wirklich ein Problem des Erstellungsprozesses. Ich mache saubere Kassen der Quellen. Ich weiß, das ist schwer zu glauben ...
Mathias F
das Problem immer noch hier
Moshe L

Antworten:

176

Selbst wenn die Typen übereinstimmen, kann dieser Fehler auftreten, wenn eine Null an eine Teilansicht übergeben wird.

Sie können dies beheben, indem Sie RenderPartialmit einem Leerzeichen ViewDataDictionarywie folgt anrufen :

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

Als Referenz fand ich diese Lösung unter:
renderpartial mit Nullmodell wird vom falschen Typ übergeben

Maslow
quelle
Wenn ich einen Build habe, der nicht in Ordnung ist, führen alle an die Ansicht übergebenen Daten zu dem Fehler.
Mathias F
46
"Sie können diesen Fehler erhalten, wenn eine Null an eine Teilansicht übergeben wird" - Bingo, behoben für mich. Vielen Dank!
Nicholas Piasecki
3
Die Details, warum das so ist, werden hier erklärt: stackoverflow.com/a/1049170/187650
juFo
14

ASP.NET MVC Partials

NULL Modell wurde bestanden !!!

@Html.Partial("PartialView", model: Model)
Andrei
quelle
2
Das ist so ärgerlich, dass ich aus Protest einfach zum LAMP-Stack migrieren könnte!
Matthew Layton
1
@ series0ne sei nicht so verzweifelt, stelle nur sicher, dass dein Modell nicht null ist :)
Andrei
7

Dieser Fehler kann auftreten (und tritt auf), wenn zwischen den Daten, die die Controller-Aktionsmethode an die Ansicht liefert, und dem von der Ansicht erwarteten Datentyp eine Nichtübereinstimmung besteht. Dies wird normalerweise nicht als Erstellungsfehler angezeigt, selbst bei vorkompilierten Ansichten.

Zum Beispiel, wenn ich eine Methode habe ...

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

... und eine Ansicht mit einem Seitenattribut erstellen ...

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

... dies wird ohne Fehler kompiliert und erstellt. Wenn ich jedoch die Aktion "Erstellen" aufrufe, wird ein gelber Bildschirm angezeigt, da die Aktionsmethode "Erstellen" Daten eines Typs auslöst und die Ansicht Daten eines anderen Typs erwartet. Vielleicht möchten Sie überprüfen, ob Ihre Typen übereinstimmen ...

Neil T.
quelle
1
Ihre Erklärung ist definitiv richtig. Aber mein Problem ist, dass einige Builds in Ordnung sind und andere nicht, selbst mit derselben Quelle.
Mathias F
3

Sind Sie absolut sicher, dass dies nichts mit den Daten zu tun hat, die an die Ansicht übergeben werden? Führen Sie jedes Mal einen vollständigen Umbau durch?

Diese Fehler treten normalerweise auf, weil eine Teilansicht versucht, das an ViewPage übergebene Ansichtsmodell zu verwenden, wenn das an die Teilansicht übergebene Ansichtsmodell null ist. Mir ist klar, dass Sie implizieren, dass der Fehler irgendwie durch den Erstellungsprozess verursacht wird, aber ich sehe nicht, wie das möglich wäre. Könnte es sein, dass die bereitgestellte Site eine andere Datenbank verwendet als die Site, die Sie auf Ihrem Entwicklungscomputer ausführen, und könnten die Daten (oder der Mangel an Daten) in dieser Datenbank die Ursache des Problems sein?

Rune
quelle
Es ist wirklich der Build. Wenn ich alles neu aufbaue und belasse, verschwindet der Fehler ... oder erscheint bei einer anderen Aktion
Mathias F
2

Löst der Build überhaupt Warnungen oder Fehler aus?

Haben Sie Ihre Abhängigkeiten richtig eingerichtet? Z.B. Ansichten je nach Modell. Erstellen Sie anhand der angegebenen Abhängigkeiten heraus, in welcher Reihenfolge die Dinge kompiliert werden sollen. Z.B. Wenn Sie ein Modell ändern und die Ansicht vor dem Modell kompiliert wird, treten Probleme auf ...

Verschwindet dies, wenn Sie keine Ansichten kompilieren?

Erben Ihre Ansichten auch System.Web.Mvc.ViewPageoder System.Web.Mvc.ViewPage<T>wo ist T Ihr Modell?

svinto
quelle
Verschwindet dies, wenn Sie keine Ansichten kompilieren? Das werde ich versuchen ... Gute Idee!
Mathias F
1

Bevor Sie das Modell aus Ihrer Sicht der Benutzersteuerung zuweisen, instanziieren Sie dieses bestimmte Objekt im Konstruktor des Modells / der Entität.

Beispiel:

 public class MainEntity
 {
    public SubEntity AssociatedEntity;

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

 public class SubEntity
 {
    public string property1;
 }

Ihre Ansichtsseite:

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

Ihre Benutzersteuerung:

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

Wenn Sie einen überschreibenden Ansichtsordner haben , in dem mehrere Partials mit demselben Namen vorhanden sind (eine überschreibt eine andere mit demselben Namen), müssen Sie den Modelltyp in jeder Ansicht aktualisieren, da sonst möglicherweise dieser Fehler angezeigt wird.

cat5dev
quelle
0

Ich hatte die folgende Fehlermeldung

Das an das Wörterbuch übergebene Modellelement ist vom Typ 'System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]', für dieses Wörterbuch ist jedoch ein Modellelement vom Typ 'System.Collections.Generic.List1 erforderlich [MyProject.Models.B] '.

mit dem folgenden Code

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);

und ich habe keine Ahnung, was der Typ war

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

Trotzdem verschwindet der Fehler, wenn ich .ToList()am Ende ein hinzufüge

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);

Hoffe es hilft jemand anderem

Enrique Zavaleta
quelle
0

Für mich wurde dies durch einen dummen Fehler beim Ausschneiden und Einfügen in meinem Kontext verursacht. Ich habe diesen Fehler in meinem Kontaktindex erhalten.

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

Es wurde in Ordnung kompiliert, gab mir aber den Fehler beim Rendern der Ansicht.

(Fügen Sie dies als etwas anderes für zukünftige Leute hinzu, die nach Lösungen suchen, um es zu versuchen.)

Danielc
quelle
0

Ich habe diesen Fehler bei der Verwendung von Episerver erhalten. Ich habe einfach die return-Anweisung im Controller von geändert return View();

zu

return PartialView();

Hallonq
quelle