NHProf génère « cette déclaration exécutée à partir de la vue » d'avertissement lorsque je passe un objet ViewModel à mon ASP.NET MVC Voir la page

StackOverflow https://stackoverflow.com/questions/4470425

Question

Je viens de remarquer que sur une page de mon site, où je passe un ViewModel à ma Voir la page, NHProf donne l'avertissement suivant:

  

Cette instruction exécutée de la vue, ce qui peut entraîner de mauvaises performances et / ou un comportement fragile.

Il relie ensuite à cette page: http://nhprof.com/Learn/Alerts/QueriesFromViews

Mon ViewModel se compose de seulement deux propriétés:

public IEnumerable<Photo> Photos { get; set; }
public Photo SelectedPhoto { get; set; }

J'attribue les photos à ce ViewModel dans mon contrôleur comme suit:

PhotoViewModel myViewModel = new PhotoViewModel();
myViewModel.Photos = entity.Photos;

My View hérite de toute évidence ce type, et en dehors de la sortie d'un en-tête (qui utilise l'objet SelectedPhoto), il boucle juste à travers chacun des Photos rendu du contenu pour chacun d'eux.

NHProf montre la requête « problème » comme où il récupère la collection de photos que je Boucler dans à mon avis, bien que je ne dis pas explicitement de partir et d'obtenir ces documents à partir de mon point de vue - je « ai passé ces documents dans la propriété Photos de mon ViewModel.

J'ai d'autres pages où je ne ai pas besoin de passer un ViewModel et je passe simplement IEnumerable<Photo> à la vue, puis rendre le balisage exactement la même chose que moi dans la vue des problèmes et NHProf donne aucun avertissement (comme il ne devrait pas être) dans ce scénario.

Je pense peut-être qu'il est lié à Lazy Loading, et parce que ma collection fait partie d'un ViewModel, quand je vais à boucle à travers la propriété Photos dans le type ViewModel, il va obtenir ces documents à ce moment-là?

Est-ce que quelqu'un a une idée de ce qui se passe ici? Les fonctions du site parfaitement, mais NHProf voit juste qu'il fait quelque chose de là où il ne faut pas le faire!

Était-ce utile?

La solution

Vous n'avez pas montré comment votre collection Photos est peuplée, mais je suppose qu'il est aussi simple que viewModel.Photos = entity.Photos. Si c'est exact (ou quelque chose de similaire), alors vous êtes simplement attribuer la collection d'entités lazy-chargé à votre modèle de vue.

Il y a plusieurs façons d'aborder ce sujet, mais ils sont essentiellement les mêmes: vous devez déclencher le chargement de votre collection avant Alimenter le modèle de vue. La meilleure façon de le faire est de simplement coller un .ToArray() ou équivalent sur la collection que vous affectez; qui va forcer une lecture.

Autres conseils

Vous avez raison. Elle est liée au chargement Lazy. Essayez de charger des photos avec impatience. Et vérifier leurs relations. Peut-être qu'ils ont une certaine avec le chargement désireux, vous n'avez pas besoin, ou que vous essayez d'utiliser une entité associée à votre point de vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top