web-dev-qa-db-ja.com

辞書に渡されるモデルアイテムのタイプは「mvc.Models.ModelA」ですが、この辞書には「mvc.Models.ModelB」タイプのモデルアイテムが必要です

私のビルドのいくつかでこの厄介な間違いがあります。

プロジェクトにエラーはありません。もう一度ビルドすると問題は消えます。このメッセージは、サイトがWindows 2008 Serverに展開されている場合にのみ表示されます。

最初は一時ファイルの問題だと思っていましたが、そうではありません。ビルドを別のWebにデプロイしましたが、エラーが引き続き表示されます。

このエラーは、サイトのランダムアクションで表示されます。ほとんどの場合、ビルドは問題ありませんが、3番目または4番目のビルドごとにランタイムエラーが発生します。

リリースモードでWebdeploymentProjectを使用してビルドします。ビューはプリコンパイルされています。

それは ASP.NET MVCでは、正しい型付けされたオブジェクトを使用してページをレンダリングするときに、誤った型エラーが発生します です。これは、ビューの名前がまったく異なるためです。

この問題をデバッグするにはどうすればよいですか?

これが私の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 [〜#〜]

数ヶ月後、この問題は消えました。私はもう1年以上問題を抱えていません。誰もそれを期待していないときに、問題が再び襲われると思います。

EDIT 2

…今から2年以上。私はとても幸運な男です!

EDIT 3

MSDNの記事 を読んだだけで、私が抱えていた問題のように聞こえます。デバッグを無効にしていますが、それでもコンパイルは「時々間違っていました」。古いプロバイダーの動作が問題になる可能性があります。しかし、これは推測に過ぎません。

サーバーブロックのないHTMLの長いスパン(<%=%>など)を含む非常に大きなページは、デバッグコンパイルが有効になっているときにスタックオーバーフローを引き起こし、アプリケーションをクラッシュさせる可能性があります。テストでは、古いプロバイダーで同様の問題が発生する可能性がある最大4倍のページを使用しましたが、この場合、アプリケーション全体がクラッシュしますが、古いプロバイダーでは問題のあるページが失敗することに注意してください

70
Mathias F

型が一致しても、部分ビューにnullが渡されると、このエラーが発生する可能性があります。

これを修正するには、次のようにRenderPartialを空のViewDataDictionaryで呼び出します。

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

参考のために、このソリューションは次の場所で見つけました。
nullモデルのレンダー部分に間違った型が渡される

175
Maslow

ASP.NET MVCパーシャル

NULLモデルが渡されました!!!

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

このエラーは、コントローラーアクションメソッドがビューに提供しているデータと、ビューが予期しているデータのタイプとの間に不一致がある場合に発生する可能性があります。これは通常、プリコンパイルされたビューであっても、ビルドエラーとして表示されません。

たとえば、メソッドがある場合...

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

...そして、ページ属性を持つ作成ビュー...

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

...これはエラーなしでコンパイルおよびビルドされます。ただし、Createアクションを呼び出すと、黄色の画面が表示されます。これは、Createアクションメソッドが1つのタイプのデータをスローし、ビューが異なるタイプのデータを予期しているためです。タイプが一致していることを確認したい場合があります...

7
Neil T.

絶対これはビューに渡されるデータとは何の関係もないことを確認していますか?毎回完全な再構築を実行していますか?

通常、これらのエラーは、部分ビューに渡されたビューモデルがnullのときに、部分ビューがViewPageに渡されたビューモデルを使用しようとするために発生します。エラーはビルドプロセスに何らかの原因があることを意味していることを理解していますが、それがどのように可能かはわかりません。展開されたサイトが、開発マシンで実行しているサイトとは異なるデータベースを使用している可能性があり、そのデータベース内のデータ(またはデータ不足)が問題の原因である可能性がありますか?

3
Rune

ビルドは警告またはエラーをトリガーしますか?

依存関係が正しく設定されていますか?例えば。モデルに応じたビュー。ビルドは、指定された依存関係を見て、物事をコンパイルする順序を決定します。例えば。モデルを変更し、問題が発生する前にビューがコンパイルされた場合...

ビューをコンパイルしない場合、これは消えますか?

また、ビューはSystem.Web.Mvc.ViewPageまたはSystem.Web.Mvc.ViewPage<T>(Tはモデル)を継承しますか?

2
svinto

ビューからユーザーコントロールにモデルを割り当てる前に、Model/Entityのコンストラクターで特定のオブジェクトをインスタンス化します。

例:

 public class MainEntity
 {
    public SubEntity AssociatedEntity;

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

 public class SubEntity
 {
    public string property1;
 }

あなたの表示ページ:

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

ユーザーコントロール:

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

同じ名前の複数のパーシャルが存在するオーバーライドするViewsフォルダーがある場合(同じ名前の別のパーシャルがオーバーライドされる)、各ビューのモデルタイプを必ず更新してください。そうしないと、このエラーが発生する可能性があります。

0
cat5dev

次のエラーメッセージが表示されました

ディクショナリに渡されるモデルアイテムのタイプは「System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A、MyProject.Models.B]」ですが、このディクショナリには「System.Collections.Generic.List1」タイプのモデルアイテムが必要です[MyProject.Models.B] '。

次のコードで

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

そして、私はタイプが何であったかわからない

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

とにかく、最後に.ToList()を追加するとエラーは消えます

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

それが他の誰かを助けることを願っています

0

私にとって、これは私のコンテキストでの愚かな切り取りと貼り付けのエラーが原因でした。連絡先インデックスでこのエラーが発生していました。

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

コンパイルは正常に完了しましたが、ビューをレンダリングしようとしたときにエラーが発生しました。

(これを試して解決策を探している将来の人々のために何か他のものとして追加します。)

0
danielc