Tengo una pagina:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
Y sobre esto, lo siguiente:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Aquí está el objeto DTO:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
y aquí está el parcial:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Cuando Model.Tasks no es nulo, todo funciona bien. Sin embargo, cuando es nulo me sale:
El elemento modelo que se pasa al diccionario es del tipo 'DTOSearchResults' pero este diccionario requiere un elemento modelo del tipo 'System.Collections.Generic.IEnumerable`1 [Tarea]'.
Pensé que no debía saber qué sobrecarga usar, así que hice esto (ver más abajo) para ser explícito, ¡pero sigo teniendo el mismo problema!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Sé que puedo evitar esto al verificar nulo, o incluso no pasar nulo, pero ese no es el punto. ¿Por qué está pasando esto?
fuente
La respuesta de @ myandmycode es buena, pero una respuesta un poco más corta sería
Esto funciona porque
ViewDataDictionary
es lo que contiene el modelo, y puede aceptar un modelo como parámetro constructor. Básicamente, esto pasa un diccionario de datos de vista "completo", que por supuesto solo contiene el modelo posiblemente nulo.fuente
new ViewDataDictionary(null)
? Porque eso elegiría una sobrecarga diferente, una con unViewDataDictionary
parámetro, que probablemente no aceptaría valores nulos.null
, es lo mismo que llamar, lonew ViewDataDictionary(null)
que provoca que se invoque la sobrecarga más específica.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Está usando el constructor incorrecto si es nulo.Parece que cuando la propiedad del Modelo que está pasando es nula, MVC intencionalmente vuelve al Modelo "principal". Aparentemente, el motor MVC interpreta un valor de modelo nulo como una intención de usar el anterior.
Un poco más de detalles aquí: ASP.NET MVC, vistas fuertemente tipadas, falla parcial de los parámetros de vista
fuente
Si no desea perder sus ViewData anteriores en la vista parcial, puede intentar:
fuente
Una solución sería crear un HtmlHelper como este:
La
Partial<T>(...)
coincidencia antes delPartial(...)
error tan conveniente y sin ambigüedad al compilar.Personalmente, me resulta difícil entender el comportamiento. ¿Parece difícil imaginar esto como una opción de diseño?
fuente
Aunque esto ha sido respondido, me encontré con esto y decidí que quería resolver este problema para mi proyecto en lugar de solucionarlo
new ViewDataDictionary()
.Creé un conjunto de métodos de extensión: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
También agregué algunos métodos que no llaman al parcial si el modelo es nulo , esto ahorrará muchas declaraciones if.
Los creé para Razor, pero algunos de ellos también deberían funcionar con vistas de estilo aspx (las que usan HelperResult probablemente no sean compatibles).
Los métodos de extensión se ven así:
También hay métodos para
IEnumerable<object>
modelos y los de descarte también se pueden llamar con una Razor lambda que le permite envolver el resultado parcial con algo de html.Siéntase libre de usarlos si lo desea.
fuente
Mi solución a esto es:
fuente