RenderAction è compatibile con l'architettura MVC?

0

Quindi mi sono imbattuto in un metodo di estensione integrato in ASP.NET MVC: ChildActionExtensions.RenderAction(...) . Questo richiama un metodo di azione usando i parametri dati e rende il risultato in linea nella vista.

Questo mi ha sorpreso perché pensavo che l'architettura MVC avesse il controller che impostava il modello e lo passava nella vista, in modo tale che tutti i dati necessari alla vista fossero nel modello al momento in cui viene richiamata la vista. Questa azione fa sì che la vista si inverta e dica "a proposito, controller, ho bisogno di un mucchio di ulteriori informazioni da renderizzare". In che modo è compatibile con l'architettura MVC? Non solo è possibile in ASP.NET MVC, ma è integrato nel framework che suggerisce che è stato approvato da persone che sanno cosa stanno facendo. Quindi qualcuno potrebbe dirmi perché ha senso per la visione di farlo?

    
posta Jez 11.06.2018 - 11:09
fonte

2 risposte

1

This surprised me because I thought the MVC architecture had the controller setting up the model and passing it into the view, such that all the data needed by the view would be in the model by the time the view is called.

L'M in MVC non è il modello di vista (come appare in ASP.NET), è il modello di dominio (il livello della logica aziendale - presupponendo che la logica del dominio sia più coinvolgente di allora " recuperare o scrivere alcuni dati "). L'idea alla base di MVC è quella di disaccoppiare la vista e il controllore dal modello di dominio (con la direzione delle dipendenze verso il modello di dominio). I modelli di vista che si passano alla vista (che è, in questo caso, essenzialmente un modello HTML per generare HTML finale) sono molto spesso solo sacchi di dati che vengono utilizzati per trasferire alcuni dati (che in definitiva hanno origine) dal modello di dominio, al visualizza, senza esplicito, in base ai dettagli di implementazione del dominio (i tipi del dominio). È più o meno questo: MVC non impone che le viste non possano richiedere ulteriori dati in un secondo momento nel ciclo di vita della pagina. Ora, se questa è una buona pratica o no, potrebbe essere in discussione per alcuni - il punto è che non va contro MVC, in senso stretto.

    
risposta data 11.06.2018 - 15:05
fonte
0

La risposta breve è no non è incompatibile con MVC. In effetti aiuta.

La tua vista può essere composta di dati correlati e non correlati. Ci sono diversi strumenti disponibili per aiutarti a costruire il tuo schermo in modo da applicare il Single Responsibility Principle (SRP) e comprensibile. Ho trovato un buon riepilogo di perché sceglieresti l'uno rispetto all'altro.

Diciamo che stiamo sviluppando un blog. Abbiamo il nostro articolo principale con i commenti sottostanti. In questo caso sarebbe ragionevole utilizzare RenderPartial() per i commenti. Esempio:

public ActionResult Display(int id)
{
    Model = Articles.Find(id);

    if (Model == null) return NotFound();
}

Nella vista avresti qualcosa di simile a questo:

<article>
    <header>@Model.Title</header>
    <div class="blog-content">
        @RawHtml(Model.Content)
    </div>
    <div class="blog-comments>
        @foreach(var comment in Model.Comments)
        {
            RenderPartial("_Comment", comment);
        }
    </div>
</article>

Fin qui tutto bene. È tutto in quello che ti aspetti. Tuttavia, cosa succede se si desidera elencare le categorie sulla stessa pagina? o forse i primi 5 articoli? Ecco dove useresti RenderAction() . La logica di ciò che vuoi mostrare non ha nulla a che fare con il contenuto che hai appena impostato. È anche qualcosa che sarebbe meno che desiderabile includere nel metodo Display() .

<section id="top-five">
    @RenderAction("TopFive")
</section>
<section id="categories">
    @RenderAction("Categories")
</section>

Ciò consente al framework di inviare la chiamata del metodo di azione allo stack e di rendere i risultati direttamente sullo stesso output. Quando viene eseguito il rendering dell'output, il framework si apre su tale contesto per tornare alla pagina principale. Ciò ti consente di incorporare contenuto non correlato nella stessa pagina perché fa bene agli utenti, ma mantiene comunque una base di codice comprensibile.

    
risposta data 11.06.2018 - 15:35
fonte

Leggi altre domande sui tag