Domanda Equivalente di Html.RenderAction in ASP.NET Core


Sto cercando di passare a ASP.NET Core dalla mia piccola applicazione ASP.NET MVC 4.

Nella mia applicazione MVC 4, ho un file di Layout che usa RenderSection come:

@RenderSection("xyz", required: false)

Quindi, nel mio file di indice, ho:

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

Quindi, sto chiamando il metodo di azione del controller abc () da Index. Il metodo abc () passa un oggetto modello e restituisce una vista parziale con quel modello. Non riesco a utilizzare RenderPartial in quanto ha bisogno di un modello da passare.

Ora, in ASP.NET Core, non ho il metodo RenderAction ().

La mia domanda è: come invocherò un metodo di azione del controller dal mio file di indice? C'è qualche altro helper HTML per quello (anche se non ne vedo nessuno)?

.


10
2017-12-28 00:30


origine


risposte:


Finalmente sono riuscito a farlo con ViewComponent. Quindi, invece di RenderAction (), ho fatto:

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

Dove abc è una classe come abcViewComponent. Il ViewComponent ha il seguente aspetto:

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);
        }
    }

Quindi, ho creato una vista sotto una nuova cartella 'mc' come Views / Home / Components / mc / Default.cshtml

È da notare che il nome della vista è Default.cshtml e questo è il modo in cui ha funzionato. Se qualcuno ha una soluzione migliore, per favore fatemelo sapere.

Grazie per avermi indicato nella direzione di ViewComponent.


14
2017-12-29 04:44



Solo per il completamento della domanda precedente, è probabilmente più sicuro passare il nome della classe ViewComponent come mostrato di seguito:

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

e sebbene sia comune usare "Default" come visualizzazione risultante, puoi anche restituire il nome della vista se questo differisce dall'impostazione predefinita:

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);
    }
}

2
2018-01-18 13:25



C'è una soluzione alternativa, è possibile utilizzare l'Url.Action + JQuery per eseguire il rendering del contenuto.

La vista in cui desideri eseguire il rendering sarà simile a questa:

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

Il controller Home:

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

La vista

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

Se vuoi avere più controllo sulla richiesta puoi leggere qui maggiori informazioni: jQuery.get ()


0
2017-08-03 21:39