Элемент модели, передаваемый в словарь, имеет тип «mvc.Models.ModelA», но для этого словаря требуется элемент модели типа «mvc.Models.ModelB». - PullRequest
70 голосов
/ 23 февраля 2010

У меня есть эта досадная ошибка в некоторых моих билдах.

В проекте нет ошибок, потому что, если я соберу снова, проблема исчезнет. Сообщение появляется только при развертывании сайта на 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>

EDIT

Через несколько месяцев эта проблема исчезла. У меня не было проблем больше 1 года. Я думаю, что проблема возникнет снова, когда никто не ожидает этого.

РЕДАКТИРОВАТЬ 2

… уже более 2 лет. Я такой счастливый чувак!

РЕДАКТИРОВАТЬ 3

Я только что прочитал статью о MSDN , и это звучит как проблема, с которой я столкнулся. У меня отключена отладка, но все равно компиляция была "иногда неправильной". Поведение старого провайдера может быть проблемой. Но это только догадки.

Очень большие страницы, содержащие длинные пролеты HTML без серверных блоков (например, <% =%>), могут вызвать переполнение стека при включенной отладочной компиляции, что приведет к сбою приложения. Обратите внимание, что в нашем тестировании была взята страница, которая в ~ 4 раза больше, что вызвало бы аналогичную проблему у старого провайдера, но в этом случае это приводит к сбою всего приложения, в то время как со старым провайдером просто происходит сбой страницы-нарушителя

Ответы [ 9 ]

174 голосов
/ 19 марта 2010

Даже если типы совпадают, вы можете получить эту ошибку, когда ноль передается в частичное представление.

Вы можете это исправить, вызвав RenderPartial с пустым ViewDataDictionary следующим образом:

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

Для справки, я нашел это решение по адресу:
renderpartial с нулевой моделью получает неправильный тип

14 голосов
/ 25 ноября 2013

ASP.NET MVC Partials

NULL модель прошла !!!

@Html.Partial("PartialView", model: Model)
7 голосов
/ 06 марта 2010

Эта ошибка может возникать (и возникает), когда существует несоответствие между данными, которые метод действия контроллера предоставляет представлению, и типом данных, ожидаемых представлением. Обычно это не будет отображаться как ошибка сборки, даже с предварительно скомпилированными представлениями.

Например, если у меня есть метод ...

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

... и представление Создать с атрибутом страницы ...

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

... это скомпилирует и соберет без ошибок. Однако, когда я вызываю действие Create, я получаю желтый экран, потому что метод действия Create создает данные одного типа, а представление ожидает данные другого типа. Возможно, вы захотите убедиться, что ваши типы соответствуют ...

3 голосов
/ 06 марта 2010

Вы абсолютно уверены, что это не имеет ничего общего с данными, передаваемыми в представление? Вы выполняете полную перестройку каждый раз?

Эти ошибки обычно возникают из-за того, что частичное представление пытается использовать модель представления, переданную в ViewPage, когда модель представления, переданная в частичное представление, является нулевой. Я понимаю, что вы подразумеваете, что ошибка как-то вызвана процессом сборки, но я не понимаю, как это было бы возможно. Может ли быть так, что развернутый сайт использует базу данных, отличную от сайта, который вы запускаете на компьютере разработчика, и могут ли данные (или их отсутствие) в этой базе данных стать причиной проблемы?

2 голосов
/ 06 марта 2010

Вызывает ли сборка какие-либо предупреждения или ошибки вообще?

Правильно ли настроены ваши зависимости?Например.просмотров в зависимости от модели.Сборка выясняет, в каком порядке нужно компилировать вещи, глядя на указанные зависимости.Например.если вы изменяете модель, и представление компилируется до того, как у модели возникнут проблемы ...

Исчезает ли это, если вы не компилируете представления?

Также ваши представления наследуют System.Web.Mvc.ViewPage или System.Web.Mvc.ViewPage<T> где Т ваша модель?

1 голос
/ 21 июля 2010

Перед назначением модели пользовательскому контролю из вашего представления создайте экземпляр этого конкретного объекта в конструкторе модели / объекта.

Пример:

 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 голосов
/ 09 февраля 2018

Для меня это было вызвано глупой ошибкой вырезания и вставки в моем контексте. Я получал эту ошибку в моем Контактном индексе.

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

Он скомпилирован нормально, но выдает ошибку при попытке отрисовки представления.

(добавляя это как что-то еще для будущих людей, которые ищут решения, чтобы попробовать.)

0 голосов
/ 06 сентября 2016

У меня было следующее сообщение об ошибке

Элемент модели, переданный в словарь, имеет тип '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 голосов
/ 24 сентября 2015

Если у вас есть переопределенная папка Views , в которой существует несколько частей с одним и тем же именем (одна переопределяет другую с тем же именем), обязательно обновите тип модели в каждом представлении, иначе вы можете получить это ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...