102 votes

Transmettre des données à la page maître en ASP.NET MVC

Quelle est votre méthode pour transmettre des données à la page principale (en utilisant ASP.NET MVC) sans enfreindre les règles de MVC ?

Personnellement, je préfère coder un contrôleur abstrait (contrôleur de base) ou une classe de base qui est transmise à toutes les vues.

77voto

Generic Error Points 2049

Si vous préférez que vos vues aient des classes de données de vue fortement typées, cela peut vous convenir. D'autres solutions sont probablement plus correctes mais c'est un bon équilibre entre le design et l'aspect pratique, IMHO.

La page maîtresse contient une classe de données de vue fortement typée qui ne contient que les informations qui la concernent :

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

Chaque vue utilisant cette page maîtresse prend une classe de données de vue fortement typée contenant ses informations et dérivant des données de vue des pages maîtresses :

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

Comme je ne veux pas que les contrôleurs individuels sachent comment assembler les données des pages maîtresses, j'encapsule cette logique dans une fabrique qui est transmise à chaque contrôleur :

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

L'héritage correspond bien à la relation maître-vue, mais lorsqu'il s'agit de rendre des éléments partiels ou des contrôles utilisateur, je composerai leurs données de vue dans les données de vue de la page, par ex.

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

Il s'agit uniquement d'un code d'exemple qui n'est pas destiné à être compilé tel quel. Conçu pour ASP.Net MVC 1.0.

60voto

Todd Menier Points 3599

Je préfère diviser les parties de la vue principale basées sur les données en parties partielles et les rendre à l'aide de Html.RenderAction . Cette méthode présente plusieurs avantages par rapport à l'approche populaire de l'héritage du modèle de vue :

  1. Les données de la vue principale sont complètement découplées des modèles de vue "ordinaires". La composition l'emporte sur l'héritage et permet d'obtenir un système à couplage plus lâche et plus facile à modifier.
  2. Les modèles de vues principales sont élaborés par une action du contrôleur complètement distincte. Les actions "normales" n'ont pas besoin de se préoccuper de cela, et il n'y a pas besoin d'une usine de données de vue, qui semble trop compliquée à mon goût.
  3. Si vous utilisez un outil comme AutoMapper pour faire correspondre votre domaine à vos modèles de vue, vous trouverez qu'il est plus facile à configurer parce que vos modèles de vue ressembleront davantage à vos modèles de domaine lorsqu'ils n'hériteront pas des données de la vue principale.
  4. Grâce à des méthodes d'action distinctes pour les données de base, vous pouvez facilement appliquer la mise en cache de sortie à certaines régions de la page. En général, les vues principales contiennent des données qui changent moins souvent que le contenu de la page principale.

20voto

Michael La Voie Points 12445

EDITAR

Erreur générique a fourni une meilleure réponse ci-dessous. Lisez-la !

Réponse originale

Microsoft a d'ailleurs publié une entrée sur la voie "officielle pour gérer cela. Il s'agit d'une marche à suivre étape par étape, accompagnée d'une explication du raisonnement.

En résumé, ils recommandent d'utiliser une classe de contrôleur abstraite, mais voyez par vous-même.

7voto

Ian P Points 7930

Les contrôleurs abstraits sont une bonne idée, et je n'ai pas trouvé de meilleur moyen. Je suis curieux de voir ce que d'autres ont fait.

3voto

David Negron Points 971

J'ai fait quelques recherches et je suis tombé sur ces deux sites. Ils pourraient peut-être m'aider.

Astuce ASP.NET MVC #31 - Transmettre des données aux pages maîtres et aux contrôles utilisateur

Transmettre des données aux pages maîtres avec ASP.NET MVC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X