Eu tenho uma página:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
E nele, o seguinte:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Aqui está o objeto DTO:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
e aqui está o parcial:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Quando Model.Tasks não é nulo, tudo funciona bem. No entanto, quando é nulo, recebo:
O item de modelo passado no dicionário é do tipo 'DTOSearchResults', mas esse dicionário requer um item de modelo do tipo 'System.Collections.Generic.IEnumerable`1 [Task]'.
Achei que ele não deveria saber qual sobrecarga usar, então fiz isso (veja abaixo) para ser explícito, mas continuo com o mesmo problema!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Eu sei que posso contornar isso, verificando se é nulo ou nem mesmo passando nulo, mas esse não é o ponto. Por que isso está acontecendo?
fonte
A resposta de @ myandmycode é boa, mas uma resposta um pouco mais curta seria
Isso funciona porque
ViewDataDictionary
é o que mantém o modelo e pode aceitar um modelo como parâmetro construtor. Isso basicamente passa um dicionário de dados de exibição "inteiro", que obviamente contém apenas o modelo possivelmente nulo.fonte
new ViewDataDictionary(null)
? Porque isso selecionaria uma sobrecarga diferente, uma com umViewDataDictionary
parâmetro, que provavelmente não aceitaria nulos.null
, é o mesmo que chamar, onew ViewDataDictionary(null)
que causa a sobrecarga mais específica a ser chamada.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Você está usando o construtor errado, se for nulo.Parece que quando a propriedade do Modelo que você está passando é nula, o MVC volta intencionalmente de volta ao Modelo "pai". Aparentemente, o mecanismo MVC interpreta um valor de modelo nulo como intenção de usar o anterior.
Um pouco mais de detalhes aqui: ASP.NET MVC, visualizações fortemente tipadas, falha parcial nos parâmetros da visualização
fonte
Se você não deseja perder seus ViewData anteriores na exibição parcial, tente:
fonte
Uma solução seria criar um HtmlHelper assim:
A
Partial<T>(...)
correspondência antes doPartial(...)
erro conveniente e sem ambiguidade ao compilar.Pessoalmente, acho difícil entender o comportamento - parece difícil imaginar isso como uma escolha de design?
fonte
Embora isso tenha sido respondido, deparei-me com isso e decidi que queria resolver esse problema do meu projeto, em vez de contorná-lo
new ViewDataDictionary()
.Criei um conjunto de métodos de extensão: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
Também adicionei alguns métodos que não chamam de parcial se o modelo for nulo , isso salvará muitas instruções if.
Eu os criei para o Razor, mas alguns deles também devem funcionar com visualizações no estilo aspx (as que usam HelperResult provavelmente não são compatíveis).
Os métodos de extensão são assim:
Também existem métodos para
IEnumerable<object>
modelos e os descartados também podem ser chamados com um lambda Razor que permite agrupar o resultado parcial com algum html.Sinta-se livre para usá-los, se quiser.
fonte
Minha solução alternativa para isso é:
fonte