J'ai une page:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
Et là-dessus, ce qui suit:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Voici l'objet DTO:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
et voici le partiel:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Lorsque Model.Tasks n'est pas nul, tout fonctionne bien. Cependant, lorsque sa valeur nulle, j'obtiens:
L'élément de modèle transmis au dictionnaire est de type «DTOSearchResults», mais ce dictionnaire nécessite un élément de modèle de type «System.Collections.Generic.IEnumerable» 1 [tâche] ».
J'ai pensé qu'il ne devait pas savoir quelle surcharge utiliser, alors j'ai fait cela (voir ci-dessous) pour être explicite, mais j'ai toujours le même problème!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Je sais que je peux contourner cela en vérifiant null, ou même en ne passant pas null, mais ce n'est pas le point. Pourquoi cela arrive-t-il?
la source
La réponse de @ myandmycode est bonne, mais une réponse légèrement plus courte serait
Cela fonctionne parce que
ViewDataDictionary
c'est l'élément qui contient le modèle, et il peut accepter un modèle comme paramètre constructeur. Cela passe essentiellement un dictionnaire de données de vue «entier», qui bien sûr ne contient que le modèle éventuellement nul.la source
new ViewDataDictionary(null)
? Parce que cela choisirait une surcharge différente, une avec unViewDataDictionary
paramètre, qui n'accepterait probablement pas les null.null
, c'est la même chose que l'appelnew ViewDataDictionary(null)
qui provoque l' appel de la surcharge la plus spécifique.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Vous utilisez le mauvais constructeur s'il est nul.Il semble que lorsque la propriété du modèle que vous transmettez est nulle, MVC revient intentionnellement au modèle "parent". Apparemment, le moteur MVC interprète une valeur de modèle nulle comme l'intention d'utiliser la précédente.
Un peu plus de détails ici: ASP.NET MVC, vues fortement typées, problème de paramètres de vue partielle
la source
Si vous ne souhaitez pas perdre vos ViewData précédentes dans la vue partielle, vous pouvez essayer:
la source
Une solution serait de créer un HtmlHelper comme ceci:
L'
Partial<T>(...)
apparié avant l'Partial(...)
erreur si pratique et sans ambiguïté lors de la compilation.Personnellement, je trouve difficile de comprendre le comportement - semble difficile d'imaginer cela comme un choix de conception?
la source
Bien que cela ait été répondu, je suis tombé sur cela et j'ai décidé que je voulais résoudre ce problème pour mon projet au lieu de le contourner
new ViewDataDictionary()
.J'ai créé un ensemble de méthodes d'extension: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
J'ai également ajouté quelques méthodes qui n'appellent pas le partiel si le modèle est nul , cela économisera beaucoup d'instructions if.
Je les ai créés pour Razor, mais certains d'entre eux devraient également fonctionner avec des vues de style aspx (celles qui utilisent HelperResult ne sont probablement pas compatibles).
Les méthodes d'extension ressemblent à ceci:
Il existe également des méthodes pour
IEnumerable<object>
modèles et celles qui sont supprimées peuvent également être appelées avec un lambda Razor qui vous permet d'envelopper le résultat partiel avec du html.N'hésitez pas à les utiliser si vous le souhaitez.
la source
Ma solution à cela est la suivante:
la source