J'ai une liste déroulante qui affiche les valeurs d'une table à l'utilisateur final. J'aimerais que ces valeurs soient triées par ordre alphabétique.
Selon la conception MVC appropriée, à quelle couche dois-je placer ma logique de tri: le modèle, la vue ou le contrôleur?
EDIT : En réponse à la question de LarsH, "Voulez-vous dire du code qui détermine quel ordre de tri est souhaité? Ou du code qui effectue le tri?", Je faisais à l'origine référence au code qui détermine quel ordre de tri est souhaité.
asp.net-mvc
model-view-controller
Ryan Kohn
la source
la source
Réponses:
(Remarque: cette citation et cette citation sont tirées de la réponse de @ dasblinkenlight , mais nous ne sommes pas d'accord sur notre interprétation de celle-ci. Lisez son message et décidez-vous ).
Selon la description MVC ,
La logique de tri (par exemple, le comparateur de tri / algorithme de tri) appartient au modèle car elle contient des règles métier et des données d'état. Puisque la modification de la façon dont les données du modèle sont triées tombe carrément dans la catégorie «modifier la présentation de la vue du modèle», le contrôleur est responsable de «faire le tri» en appelant la méthode model.changeSortedState ().
la source
public void Sort(bool sortByDescending = false)
, si faux, il trie par ordre croissant. Ou ayez simplement deux méthodes de tri différentes si la logique est très différente.Qui contrôle l'ordre de tri?
(De Wikipedia )
1) Ordre naturel dans les données elles-mêmes:
La commande fait partie du modèle, elle devrait donc y aller. Une extraction brute de «toutes les données» renverrait les données dans l'ordre trié, et il n'y a pas d'interface pour choisir l'ordre de tri.
2) L'utilisateur doit contrôler la façon dont il voit les données:
La vue fournirait une interface (telle que des flèches ascendantes / descendantes) qui interagissent avec le contrôleur, et le modèle comprend suffisamment bien les données pour effectuer le tri demandé sur les données. Cependant, une extraction brute des données ne doit pas nécessairement être triée, contrairement à (1).
Dans tous les cas,
La vue ne comprend pas qu'un tri est en cours, à part la possibilité de montrer quelle direction de tri a été choisie. N'y mettez pas la logique.
Petite mise en garde
La fonctionnalité de tri pourrait aller purement dans la vue, dans une circonstance (que je peux penser désinvolte; il peut y en avoir plus):
Un tri "stupide" où toutes les données sont déjà dans la vue et il n'est pas nécessaire d'utiliser des connaissances de domaine pour effectuer le tri. Comparaison de chaînes ou de nombres très simple, par exemple. Cela n'est pas possible, par exemple, dans les résultats de recherche sur une page Web lorsque les résultats sont susceptibles d'être répartis sur plusieurs pages.
la source
Selon la description MVC ,
Selon cela, la logique de tri appartient au contrôleur, car la modification de la manière dont les données du modèle sont triées relève carrément de la catégorie «modifier la présentation de la vue du modèle».
EDIT: Pour clarifier les multiples malentendus exprimés dans les commentaires, la "logique de tri" n'est pas le code qui effectue le tri; c'est le code qui définit le tri. La logique de tri compare des éléments individuels les uns aux autres pour établir un ordre (par exemple via une instance de
IComparator<T>
) ou contient une logique qui construit un objet à utiliser pour la commande par un système externe (par exemple via une instance deIOrderedQueryable<T>
). Cette logique appartient à votre contrôleur, car elle nécessite des connaissances liées au côté «métier» de votre application. Il est tout à fait suffisant d'effectuer le tri, mais il est séparé du code qui effectue réellementil. Le code qui trie peut être dans votre vue, dans votre modèle ou même dans la couche de persistance qui soutient votre modèle (par exemple votre base de données SQL).la source
IComparer<T>
. La «mécanique passe-partout» restante du tri, y compris la récupération des données du modèle, dépend de la vue.{Unknown, Pass, Fail}
. Supposons également que leUnknown
tri doit toujours être effectué en dernier, quel que soit l'ordre croissant ou décroissant choisi par l'utilisateur. Placer cette logique dans la vue en dirait trop sur la nature commerciale des données à l'intérieur ducode
champ. La vue ne doit pas le savoir: tout ce qu'elle sait, c'est que l'utilisateur a effectué un geste de "tri" (par exemple, a cliqué sur un en-tête); le reste appartient au contrôleur.Aucune de ces réponses. Le tri est une logique métier, et la logique métier n'appartient à aucun des trois. Tous les morceaux de code de votre application ne seront pas un modèle, une vue ou un contrôleur.
Ce que je fais généralement dans mes applications MVC, c'est que j'ai une couche de service qui exécute toute la logique métier. Les méthodes de la couche de service doivent avoir une API propre et simple avec des paramètres bien nommés. Vous pouvez ensuite appeler ces méthodes à partir de votre contrôleur pour manipuler les données dans les modèles.
En ce sens, le tri est "dans le contrôleur", mais le code lui-même qui effectue le tri ne doit pas être implémenté dans le contrôleur, mais uniquement appelé à partir de là.
la source
Certainement pas le contrôleur: il envoie des messages à visualiser et à modéliser, mais devrait faire le moins de travail possible. Si l'utilisateur peut modifier le tri, cette demande est gérée par le contrôleur en informant le modèle ou la vue à ce sujet.
Peut-être la vue si c'est une chose pure vue. Si l'application fonctionne aussi bien sans trier, alors le tri fait simplement partie de la représentation et doit aller dans la vue.
Si la commande fait partie intégrante du domaine, elle doit aller dans le modèle.
la source
Le choix est donc le suivant: pensez-vous que cela fait partie de la logique métier du domaine ou de la logique de présentation.
Si vous implémentiez un modèle MVC Model2 approprié ou un modèle MVC classique, je dirais que l'ordre des données fournies par la couche de modèle doit être déclenché par la demande de la vue à la couche de modèle. La vue demande des données ordonnées, la couche de modèle les fournit.
Mais, puisque vous utilisez l'interprétation du modèle MVC par ASP.NET MVC, qui est un peu différente de votre MVC standard, l'instance ViewModel doit demander des informations ordonnées à la couche de modèle (pour une raison quelconque, le framework ASP.NET pense que les modèles doivent être appelés les "vues" et les vues devraient être appelées "viewmodels" ... c'est étrange).
la source
Je le ferais généralement dans le contrôleur pour rester en ligne avec le modèle selon les autres réponses. Voir ci-dessous pour le raisonnement.
J'ai réfléchi à cela et lu les réponses et les documents connexes et, de manière pragmatique, je dirais que cela dépendrait de votre application, par exemple:
S'agit-il d'une application moyenne / grande et / ou a plusieurs interfaces utilisateur associées (c'est-à-dire une application Windows, une interface Web et une interface téléphonique).
S'il s'agit d'un site Web d'interface utilisateur unique bien défini et que vous utilisez quelque chose comme EF Code First et que vous n'avez pas ou n'avez pas l'intention de créer une couche de service et prévoyez d'utiliser une méthode d'extension simple prête à l'emploi pour l'atteindre:
Si c'est le même que celui ci-dessus, MAIS ne peut pas être implémenté avec une méthode d'extension prête à l'emploi.
Pour résumer:
Réponse dogmatique: couche de service
Réponse pragmatique: généralement le contrôleur
la source
Je suggérerais de trier les données à partir d'une table, les données suffisamment petites pour être utiles dans une liste déroulante devraient provenir de la base de données déjà triée via la requête. Pour moi, cela fait du modèle l'endroit où le tri est appliqué.
Si vous êtes déterminé à faire le tri à la main, je pense qu'il y a de bons arguments pour utiliser le modèle ou le contrôleur comme votre endroit préféré pour la logique. La limitation serait votre cadre particulier. Je préfère gérer les données uniquement dans le modèle. J'utilise le contrôleur pour marier les données (modèle) et la présentation (vue) comme je l'ai été (autodidacte).
la source
Bien que je sois d'accord en principe avec l'idée que le tri relève de la logique métier, car en le décomposant selon son origine, vous obtiendrez quelque chose comme "Le client souhaite que la page du produit s'affiche avec les images triées par date", alors il devient clair que l'ordre de tri des données n'est généralement pas arbitraire - même s'il n'y a pas de tri car c'est toujours une décision commerciale par omission (une liste vide est toujours une liste).
MAIS ... Ces réponses ne semblent pas prendre en compte les progrès de la technologie ORM, je ne peux parler que par rapport à l'Entity Framework (évitons une dispute pour savoir si c'est vrai ORM, ce n'est pas le point) de Microsoft comme c'est ce que j'utilise, mais je suis sûr que d'autres ORM offrent des fonctionnalités similaires.
Si je crée une vue fortement typée pour une classe Product à l'aide de MS MVC et Entity Framework et qu'il existe une relation de clé étrangère entre la table Product et Image (par exemple FK_Product_Image_ProductId), alors je serais en mesure de trier rapidement les images pendant leur affichage en utilisant quelque chose comme ceci dans la vue:
Il a été mentionné une couche de logique métier spécifique, que j'utilise également pour exécuter 80% de ma logique métier, mais je ne vais pas écrire une fonctionnalité de tri dans ma couche de logique métier qui imite quelque chose qui sort de la boîte. à partir de Entity Framework.
Je ne pense pas qu'il y ait une réponse correcte à cette question, à part cela; vous devez abstraire la logique métier complexe lorsque cela est possible, mais pas au prix de réinventer la roue.
la source
myList.OrderBy(x => x.CreationDate)
- il n'est vraiment pas nécessaire d'introduire une couche supplémentaire inutile juste pour ce faire. Pour ajouter à cela, que feraient-ils s'ils avaient besoin de données paginées et triées? Interrogez toute la table, triez-la puis conservez ce dont ils ont besoin? On pourrait simplement appelermyList.OrderBy(x => x.Date).Skip((page-1)*pageSize).Take(pageSize)
et aucune donnée inutile n'est récupérée.Supposons que vous disposez d'un site Web MVC, d'un site Web WebForms et d'une application mobile.
Si vous voulez que le tri soit cohérent entre ces couches de présentation, je dirais alors de trier en dehors de la couche de présentation. Le service serait un bon candidat.
Sinon, je stockerais cette logique dans un modèle de vue. Pourquoi? Parce qu'il sera réutilisable et facilement testable.
la source
Sur les trois que vous avez énumérés, je dirais qu'il appartient au contrôleur. Je n'aime pas vraiment placer ce type de logique dans le contrôleur, cependant. Je crée généralement une couche de service avec laquelle le contrôleur communique, qui sera chargée de communiquer avec le magasin de données et de gérer la logique de tri. Pour les petites applications, il est cependant très bien de rester assis dans le contrôleur.
la source
C'est une question posée avec asp.net à l'esprit, mais puisque quelqu'un a mentionné Rails, j'ai pensé qu'il serait intéressant de considérer le problème dans ce contexte. Dans Rails, il est naturel et assez courant d'effectuer le tri avec la récupération en tant qu'action de contrôleur, car le framework et l'API ActiveRecord / ActiveQuery le prévoient. D'autre part, il est possible de définir une sorte d'ordre de tri personnalisé pour les éléments statiques et de le placer dans le modèle à utiliser par le contrôleur, de sorte que le modèle puisse jouer un rôle dans la logique de tri même s'il n'effectue pas l'opération directement. Quoi qu'il en soit, il peut être sûr de dire que mettre la logique de tri dans la vue est généralement mal vu.
Je suis un peu amusé que certaines réponses soient absolument contre le fait de mettre le tri dans le contrôleur ou dans le modèle, et je les trouve trop pédantes à mon goût, mais je suppose que cela dépend de la nature du framework utilisé et des conventions habituelles associées à il. Je suis également d'accord avec le commentaire de Bill K selon lequel la séparation est en premier lieu plus importante.
la source