c# - El elemento de modelo que se pasa al diccionario es del tipo ''mvc.Models.ModelA'', pero este diccionario requiere un elemento de modelo de tipo ''mvc.Models.ModelB''
asp.net .net (9)
Tengo este error molesto en algunas de mis compilaciones.
No hay ningún error en el proyecto, porque si construyo nuevamente, entonces el problema desaparece. El mensaje solo aparece cuando el sitio se implementa en un servidor de Windows 2008.
Primero pensé que podría ser un problema con los archivos temporales, pero ese no es el caso. Implementé la compilación en una web diferente y el error aún aparece.
El error aparece en acciones aleatorias del sitio. La mayoría de las compilaciones de tiempo son correctas, pero cada tercera o cuarta compilación produce errores de tiempo de ejecución.
Construyo utilizando un WebdeploymentProject en modo de lanzamiento. Las vistas están precompiladas.
No es en ASP.NET MVC encuentro un error de tipo incorrecto al representar una página con el objeto tipeado correcto , porque las vistas tienen nombres totalmente diferentes.
¿Cómo puedo solucionar este problema o cómo puedo obtener ayuda para esto?
Aquí está mi 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>
EDITAR
Después de algunos meses, este problema desapareció. No he tenido problemas por más de 1 año ahora. Supongo que el problema volverá a atacar cuando nadie lo espera.
EDIT 2
... desde hace más de 2 años. ¡Soy un tipo tan afortunado!
EDIT 3
Acabo de leer un artículo en MSDN , y parece ser el problema que tuve. Tengo la depuración desactivada, pero aun así la compilación fue "a veces incorrecta". El comportamiento del proveedor anterior podría ser el problema. Pero esto es solo adivinar.
Las páginas muy grandes que contienen tramos largos de HTML sin bloques de servidor (por ejemplo, <% =%>) pueden provocar un desbordamiento de la pila cuando la compilación de depuración está habilitada y la aplicación se bloqueará. Tenga en cuenta que en nuestras pruebas se ha tomado una página que es ~ 4x tan grande que habría producido un problema similar en el proveedor anterior, pero en este caso, bloquea la aplicación completa, mientras que con el proveedor anterior simplemente falla la página ofensiva.
ASP.NET MVC Parciales
¡Modelo NULL fue aprobado!
@Html.Partial("PartialView", model: Model)
¿Estás absolutamente seguro de que esto no tiene nada que ver con los datos que se pasan a la vista? ¿Estás realizando una reconstrucción completa cada vez?
Estos errores suelen producirse porque una vista parcial intenta usar el modelo de vista que se pasa a la página de visualización cuando el modelo de vista que se pasa a la vista parcial es nulo. Me doy cuenta de que está dando a entender que el error está causado de alguna manera por el proceso de compilación, pero no veo cómo eso sea posible. ¿Podría ser que el sitio implementado use una base de datos diferente que el sitio que ejecuta en su máquina de desarrollo, y podrían los datos (o la falta de datos) en esa base de datos ser la causa del problema?
¿La construcción activa cualquier advertencia o error?
¿Tiene sus dependencias configuradas correctamente? P.ej. vistas dependiendo de los modelos. Construya las cifras en qué orden para compilar cosas mirando las dependencias especificadas. P.ej. si cambia un modelo y la vista se compila antes del modelo, se mete en problemas ...
¿Desaparecerá esto si no compilas vistas?
¿ System.Web.Mvc.ViewPage
vistas también heredan System.Web.Mvc.ViewPage
o System.Web.Mvc.ViewPage<T>
donde T es su modelo?
Antes de asignar el modelo al control de usuario desde su vista, cree una instancia de ese objeto particular en el constructor del Modelo / Entidad.
Ejemplo:
public class MainEntity
{
public SubEntity AssociatedEntity;
public MainEntity()
{
// This is where the instantiation happen.
AssociatedEntity = new SubEntity();
}
}
public class SubEntity
{
public string property1;
}
Su página de vista:
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<MyNamespace.Models.MainEntity>" %>
....
<%Html.RenderPartial("ucMyUserControl",Model.AssociatedEntity);
....
Su control de usuario:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<MyNamespace.Models.SubEntity>" %>
....
<%Html.TextBoxFor(m=>m.Property1);
Este error puede ocurrir (y lo hace) cuando hay una falta de coincidencia entre los datos que el método de acción del controlador está suministrando a la vista y el tipo de datos que espera la vista. Esto normalmente no aparecerá como un error de compilación, incluso con vistas precompiladas.
Por ejemplo, si tengo un método ...
public ActionResult Create()
{
// Do something
return View(new CustomerCreateViewModel());
}
... y una vista Crear con un atributo de página ...
<%@ Page ... Inherits="System.Web.Mvc.ViewPage<CustomerDetailsViewModel>" %>
... esto compilará y compilará sin error. Sin embargo, cuando llamo a la acción Crear, voy a obtener una pantalla amarilla, porque el método de acción Crear arroja datos de un tipo y la vista está esperando datos de un tipo diferente. Es posible que desee verificar que sus tipos coincidan ...
Incluso si los tipos coinciden, puede obtener este error cuando se pasa un valor nulo a una vista parcial.
Puede solucionar esto llamando a RenderPartial
con un RenderPartial
vacío como este:
helper.RenderPartial("~/Views/Player/PlayerName.ascx", player, new ViewDataDictionary());
Como referencia, encontré esta solución en:
renderpartial con modelo nulo pasa el tipo incorrecto
Para mí, esto fue causado por un error tonto de cortar y pegar en mi contexto. Estaba obteniendo este error en mi índice de contacto.
public DbSet<Customer> Customer { get; set; }
public DbSet<Customer> Contact { get; set; }
// Note this ^^^^^^^^ should have been Contact
Se compiló bien, pero me dio el error al tratar de representar la vista.
(Agregar esto como algo más para las personas futuras que buscan soluciones para probar).
Si tiene una carpeta de vistas anuladora, donde existen parciales múltiples del mismo nombre (uno que reemplaza a otro con el mismo nombre), asegúrese de actualizar el tipo de modelo en cada vista o puede recibir este error.
Tuve el siguiente mensaje de error
El elemento del modelo que se pasa al diccionario es del tipo ''System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]'', pero este diccionario requiere un elemento de modelo del tipo ''System.Collections.Generic.List1 [MyProject.Models.B] ''.
con el siguiente código
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);
y no tengo idea de cual era el tipo
System.Linq.Enumerable + WhereSelectListIterator2 [MyProject.Models.A, MyProject.Models.B]
de todos modos, el error desaparece cuando agrego un .ToList()
al final
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);
Espero que ayude a alguien más