web-dev-qa-db-fra.com

Comment rendre une vue partielle de manière asynchrone

Une vue partielle peut-elle être rendue de manière asynchrone?

J'ai une vue partielle qui doit rendre les articles de blog. Les articles de blog sont renvoyés de manière asynchrone.

Dans mon _Layout fichier je rend mon pied de page partiel _Footer. Dans _Footer J'ai le balisage suivant:

@Html.Action("FooterLatestBlogPosts", "Common")

Donc, dans mon contrôleur Common, j'ai la méthode d'action suivante:

public async Task<ActionResult> FooterLatestBlogPosts()
{
     List<ArticleDTO> articleDTOs = await articleTask.GetAllAsync();

     return PartialView(articleDTOs);
}

Dans ma FooterLatestBlogPosts vue partielle, j'ai les éléments suivants:

@model List<MyProject.Application.DTO.ArticleDTO>
@if (Model.Count > 0)
{
     <ul class="list-unstyled">
          @foreach (var articleDTO in Model)
          {
               <li>@articleDTO.Title</li>
          }
     </ul>
}

Je reçois une erreur:

Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'

Dois-je plutôt simplement créer un mthod synchrone pour récupérer mes données?

22
Brendan Vogt

Je suis allé avec la réponse dans le post que @buffjape a suggéré:

Async PartialView provoque l'exception "HttpServerUtility.Execute bloquée ..."

J'ai changé toutes mes méthodes en synchrones.

7
Brendan Vogt

Tout d'abord, vous devez utiliser Html.Partial Comme suggéré par @buffjape. Si votre vue partielle n'est pas dans le dossier Shared, vous devez spécifier le chemin d'accès à la vue

@Html.Partial("~/Views/Common/FooterLatestBlogPosts", yourModel)

Cependant, dans ce cas, votre vue est toujours chargée de manière synchrone. Pour le charger de manière asynchrone, vous devez le charger via jQuery. Article Améliorez les performances perçues des sites Web ASP.NET MVC avec des vues partielles asynchrones donne une très bonne description de la façon d'y parvenir.

Remplacez également votre Html.Render Par

$(document).ready(function(){
     $("#yourContainer").load('@Url.Action("FooterLatestBlogPosts", "Common")')
});
33
Andrei Mihalciuc