web-dev-qa-db-fra.com

Équivalent de Html.RenderAction dans ASP.NET Core

J'essaie de passer à ASP.NET Core à partir de ma petite application ASP.NET MVC 4.

Dans mon application MVC 4, j'ai un fichier de mise en page qui utilise RenderSection comme:

@RenderSection("xyz", required: false)

Ensuite, dans mon fichier d'index, j'ai:

@section xyz{
        @{Html.RenderAction("abc");}
    }

Donc, j'appelle la méthode d'action du contrôleur abc () depuis Index. La méthode abc () transmet un objet modèle et retourne une vue partielle avec ce modèle. Je ne peux pas utiliser RenderPartial car il a besoin d'un modèle à passer.

Maintenant, dans ASP.NET Core, je n'ai pas de méthode RenderAction ().

Ma question est: comment invoquer une méthode d'action de contrôleur à partir de mon fichier d'index? Existe-t-il un autre assistant HTML pour cela (bien que je n'en vois pas)?

.

16
user6542823

J'ai finalement pu le faire avec ViewComponent. Donc, au lieu de RenderAction (), j'ai fait:

@section xyz{
        @await Component.InvokeAsync("abc")
    }

Où abc est une classe en tant que abcViewComponent. Le ViewComponent ressemble à:

public class abcViewComponent : ViewComponent
    {
        private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>();
        public async Task<IViewComponentResult> InvokeAsync()
        {
            MyContext context = new MyContext(db);
            IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync();
            return View(mc);
        }
    }

Ensuite, j'ai créé une vue sous un nouveau dossier 'mc' comme Vues/Accueil/Composants/mc/Default.cshtml

Il est à noter que le nom de la vue est Default.cshtml et c'est ainsi que cela a fonctionné. Si quelqu'un a une meilleure solution, faites-le moi savoir.

Merci de m'avoir indiqué la direction de ViewComponent.

20
user6542823

Juste pour terminer la question ci-dessus, il est probablement plus sûr de passer le nom de la classe ViewComponent comme indiqué ci-dessous:

@section xyz{
    @await Component.InvokeAsync(nameof(yournamespace.abc))
}

et bien qu'il soit courant d'utiliser "Par défaut" comme vue résultante, vous pouvez également renvoyer le nom de la vue si cela diffère de la valeur par défaut:

public class abcViewComponent : ViewComponent
{
    private DbContextOptions<MyContext> db = new DbContextOptions<MyContext>();
    public async Task<IViewComponentResult> InvokeAsync()
    {
        MyContext context = new MyContext(db);
        IEnumerable<tableRowClass> mc = await context.tableRows.ToListAsync();
        return View("YourViewName", mc);
    }
}
5
Nick Parker

Il existe une solution de contournement, vous pouvez utiliser Url.Action + JQuery pour rendre le contenu.

La vue où vous souhaitez rendre l'action ressemblera à ceci:

<div id="dynamicContentContainer"></div>
<script>   
    $.get('@Url.Action("GetData", "Home")', {id : 1}, function(content){
            $("#dynamicContentContainer").html(content);
        });
</script>

Le contrôleur Home:

[HttpGet]
public IActionResult GetData(int id)
{
   return PartialView(id);
}

La vue

@model int 
<span>Values from controler :</span> @Model

Si vous voulez plus de contrôle sur la demande, vous pouvez lire ici plus d'informations: jQuery.get ()

3
Kabindas