传递到字典中的模型项的类型为“ mvc.Models.ModelA”,但是此字典需要模型类型为“ mvc.Models.ModelB”的模型项


70

我的某些版本中有这个烦人的错误。

该项目中没有错误,因为如果我再次构建,那么问题就消失了。仅在将站点部署到Windows 2008 Server时,才会显示该消息。

我首先认为这可能与临时文件有关,但事实并非如此。我将构建版本部署到其他网站,并且错误仍然出现。

该错误出现在站点的随机动作上。大多数时候,构建都是可以的,但是每个第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>

编辑

几个月后,这个问题消失了。我已经一年多没遇到问题了。我猜这个问题在没有人期望的时候会再次发生。

编辑2

…超过2年了。我真是个幸运儿!

编辑3

我刚刚阅读了有关MSDN的文章,这听起来像是我遇到的问题。我禁用了调试功能,但是编译仍然“有时出错”。旧提供程序的行为可能是问题所在。但这只是猜测。

如果启用了调试编译,则包含较长HTML跨度且没有服务器块的很大页面(例如<%=%>)会导致堆栈溢出,从而使应用程序崩溃。请注意,在我们的测试中,页面占用的页面大约是旧提供者中的类似问题的4倍,但是在这种情况下,它会使整个应用程序崩溃,而在旧提供者中,它只会使违规页面失败


您可以确认它与构建过程有关吗?在我看来,这听起来像是一个编码错误。您是否尝试跟踪异常?
约翰内斯·鲁道夫

可以在异常站点提供堆栈跟踪和代码段吗?
madaboutcode 2010年

@Johannes:确实是构建过程中的问题。我会清理源的结帐。我知道这很难相信……
Mathias F

问题仍然存在
Moshe L

Answers:


176

即使类型匹配,当将null传递给局部视图时,也会出现此错误。

您可以通过调用解决这个问题RenderPartial有一个空的ViewDataDictionary是这样的:

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

作为参考,我在以下位置找到了此解决方案:
具有null模型的renderpartial被传递了错误的类型


如果我的版本不正确,则任何传递给View的数据都会导致错误。
Mathias F

46
“当将null传递给局部视图时,您会收到此错误”-宾果游戏,为我修复了此错误。谢谢!
Nicholas Piasecki 2010年

3
为何执行此操作的详细信息在此处说明:stackoverflow.com/a/1049170/187650
juFo 2014年

14

ASP.NET MVC局部

NULL模型已通过!!!

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

2
这太烦人了,我可能出于抗议而只是迁移到LAMP堆栈!
马修·莱顿

1
@ series0ne不要那么拼命,只要确保您的模型不为空即可:)
Andrei

7

当控制器操作方法提供给视图的数据与视图期望的数据类型不匹配时,就会发生(并且确实会发生)此错误。即使使用预编译视图,通常也不会显示为构建错误。

例如,如果我有一个方法...

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

...以及具有Page属性的Create视图...

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

...这将编译并正确生成。但是,当我调用Create动作时,我将得到一个黄色屏幕,因为Create动作方法将抛出一种类型的数据,而视图则期望使用另一种类型的数据。您可能要验证您的类型是否匹配...


1
您的解释绝对正确。但是我的问题是,即使使用相同的源代码,某些构建也可以,而其他构建则不能。
Mathias F

3

您是否绝对确定这与传递给视图的数据无关?您是否每次都执行完整重建?

通常会发生这些错误,因为当传递给部分视图的视图模型为null时,部分视图会尝试使用传递给ViewPage的视图模型。我意识到您是在暗示错误是由构建过程引起的,但是我不知道这是怎么可能的。可能是所部署的站点使用了与您在开发计算机上运行的站点不同的数据库,并且该数据库中的数据(或缺少数据)是否可能是问题的原因?


其真正的构建。如果我重建并保留所有内容,那么错误就会消失……或出现在其他操作上
Mathias F 2010年

2

该构建是否会触发任何警告或错误?

您的依存关系设置正确吗?例如。视图取决于模型。通过查看指定的依赖关系来弄清楚以什么顺序编译事物。例如。如果您更改模型并在模型遇到麻烦之前先编译视图...

如果您不编译视图,这会消失吗?

您的视图还会继承吗,System.Web.Mvc.ViewPage或者System.Web.Mvc.ViewPage<T>模型在哪里T?


如果您不编译视图,这会消失吗?那就是我会尝试的...好主意!
Mathias F

1

在从视图将模型分配给用户控件之前,请在模型/实体的构造函数中实例化该特定对象。

例:

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

0

如果您有一个覆盖的Views文件夹,其中存在多个具有相同名称的局部(一个覆盖具有相同名称的另一个局部),请确保在每个视图上更新Model类型,否则您可能会收到此错误。


0

我收到以下错误消息

传递到字典中的模型项的类型为'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

使用Episerver时出现此错误。我只是将控制器中的return语句从 return View();

return PartialView();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.