wake-up-neo.net

Das an das Wörterbuch übergebene Modellelement ist vom Typ "mvc.Models.ModelA". Dieses Wörterbuch erfordert jedoch ein Modellelement vom Typ "mvc.Models.ModelB".

Ich habe diesen nervigen Fehler in einigen meiner Builds. 

Es gibt keinen Fehler im Projekt, denn wenn ich erneut baue, verschwindet das Problem. Die Nachricht 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 für ein anderes Web bereitgestellt und der Fehler wird immer noch angezeigt. 

Der Fehler wird bei zufälligen Aktionen der Site angezeigt. Meistens sind Builds in Ordnung, aber jeder 3. oder 4. Build erzeugt Laufzeitfehler.

Ich baue mit einem WebdeploymentProject im Freigabemodus. Ansichten werden vorkompiliert.

Es ist nicht In ASP.NET MVC stelle ich beim Rendern einer Seite mit dem richtigen typisierten Objekt einen falschen Typfehler fest , weil Ansichten völlig unterschiedliche Namen haben.

Wie kann ich dieses Problem debuggen oder wie kann ich dafür Hilfe bekommen?

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>

EDIT

Nach einigen Monaten verschwand dieses Problem. Ich habe seit über 1 Jahr keine Probleme mehr. Ich denke, das Thema wird wieder zuschlagen, wenn es niemand erwartet.

EDIT 2

… Seit über 2 Jahren. Ich bin so ein glücklicher Kerl!

EDIT 3

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

Sehr große Seiten mit langen HTML-Abschnitten ohne Serverblöcke (z. B. <% =%>) können einen Stapelüberlauf verursachen, wenn die Debug-Kompilierung aktiviert ist und die Anwendung zum Absturz bringen kann. Beachten Sie, dass in unseren Tests eine Seite mit einer Größe von 4x so groß war, dass ein ähnliches Problem beim alten Provider aufgetreten wäre. In diesem Fall stürzt jedoch die gesamte Anwendung ab, während bei dem alten Provider die fehlerhafte Seite einfach fehlschlägt

70
Mathias F

Auch wenn die Typen übereinstimmen, können Sie diesen Fehler erhalten, wenn eine Nullansicht an eine Teilansicht übergeben wird.

Sie können dies beheben, indem Sie RenderPartial mit einer leeren ViewDataDictionary wie folgt aufrufen:

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

Als Referenz fand ich diese Lösung unter:
renderpartial mit Nullmodell erhält den falschen Typ

174
Maslow

ASP.NET MVC-Partials

NULL-Modell wurde bestanden !!!

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

Dieser Fehler kann auftreten (und tritt nicht auf), wenn zwischen den Daten, die von der Controller-Aktionsmethode für die Ansicht bereitgestellt werden, und dem Datentyp, den die Ansicht erwartet, ein Konflikt besteht. Dies wird normalerweise nicht als Build-Fehler 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 fehlerfrei kompiliert und erstellt. Wenn ich jedoch die Aktion "Create" aufrufe, wird ein gelber Bildschirm angezeigt, da die Methode "Create" Daten eines Typs auslöst und die Ansicht Daten eines anderen Typs erwartet. Vielleicht möchten Sie überprüfen, ob Ihre Typen übereinstimmen ...

7
Neil T.

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 Neuaufbau 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 wurde, 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 dass die Daten (oder das Fehlen von Daten) in dieser Datenbank die Ursache des Problems sind?

3
Rune

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

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

Verschwindet das, wenn Sie keine Ansichten kompilieren?

Erben auch Ihre Ansichten System.Web.Mvc.ViewPage oder System.Web.Mvc.ViewPage<T>, wobei T Ihr Modell ist?

2
svinto

Bevor Sie das Modell der Benutzersteuerung aus Ihrer Ansicht zuweisen, müssen Sie das betreffende Objekt im Konstruktor des Modells/der Entität instanziieren.

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);
1
Siva Gopal

Wenn Sie den Ordner Views überschreiben, in dem mehrere Partials desselben Namens vorhanden sind (einer überschreibt einen anderen mit demselben Namen), stellen Sie sicher, dass der Modelltyp in jeder Ansicht aktualisiert wird. Ansonsten erhalten Sie diese Fehlermeldung.

0
cat5dev

Ich hatte die folgende Fehlermeldung

Das in das Wörterbuch übergebene Modellelement hat den Typ 'System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]', Dieses Wörterbuch erfordert jedoch ein Modellelement vom Typ 'System.Collections.Generic.List1 [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]

der Fehler verschwindet trotzdem, wenn ich am Ende eine .ToList() einfü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

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 jedoch den Fehler beim Versuch, die Ansicht zu rendern.

(Dies ist etwas anderes für zukünftige Menschen, die nach Lösungen suchen, die sie ausprobieren können.)

0
danielc