ASP.NET MVC - Partiellement mise à jour du modèle de la vue
Je me demandais comment les gens à l'approche de cette situation. C'est quelque chose qui semble être un point faible dans mon utilisation de MVC avec Orm (NHibernate dans ce cas)...
Dire que vous avez un grain fin et complexe de l'entité dans votre modèle. Vous aurez probablement une page d'administration pour gérer les objets de ce type. Si l'entité est compliqué, il est peu probable que vous allez modifier l'ensemble de l'entité dans un formulaire. Vous avez encore le besoin de transmettre les propriétés pertinentes pour la vue, et d'incorporer les modifications de ces propriétés dans le modèle lors de l'affichage retourne.
Ce que quelqu'un dans cette situation?
- Créer un modèle de vue qui est (ou contient) un sous-ensemble des entités propriétés. Passer ce vers et à partir de la vue. Dans "modifier" de la méthode d'action dans le contrôleur, obtenir l'objet de référentiel, aller même si tous les properies dans le ViewModel et de les appliquer à l'objet de Modèle (model.a = viewmodel.une, modelb = viewmodel.b). Cela semble évident sensé, mais génère beaucoup de fastidieux code de plomberie. Aussi cela complique la validation un peu.
- Quelque chose d'autre?
J'ai regardé brièvement à automapper - mais cela ne semble pas adapter le projet de loi exactement, peut-être que je me trompe?
Grâce.
Ouais, j'ai le sentiment que c'est la façon dont il doit être. On ne sait jamais, quelqu'un pourrait avoir quelques truc ingénieux...
OriginalL'auteur UpTheCreek | 2009-11-26
Vous devez vous connecter pour publier un commentaire.
Cela sonne comme le scénario parfait pour automapper. Vous créez un modèle de vue de la classe qui contient un sous-ensemble de champs ou de votre modèle réel, et de vous laisser AutoMapper prendre soin extraccting valeurs à partir du modèle du domaine de l'objet dans le modèle de vue de l'objet. Quels problèmes rencontrez-vous avec cette approche?
Considérons cet exemple:
Ici est votre modèle de domaine et de votre modèle de vue
Ici est votre mapping, vous devez créer un mappage dans les deux directions à partir de dm->vm et vm->dm.
De ce que j'ai vu lors de l'utilisation de Automapper est que si vous avez la carte de l'objet A à B et de B en a un bien Un qui n'a pas, il sera remis à zéro. Alors quand j'ai créer la carte que j'direct de l'ignorer ces propriétés manquantes. Je ne suis pas un Automapper expert donc je peut-être à l'aide de ce mal.
Cartographie
Enfin utilisation:
En raison de l'exclusion, ce n'est évidemment pas idéal, mais beaucoup mieux que de le faire manuellement l'ensemble de la chose.
J'ai juste ajouté un exemple ici pour vous.
Merci pour les détails, des exemples, on dirait qu'il n'y a plus de automapper que j'avais réalisé. Je vais faire une recherche un peu plus.
OriginalL'auteur Sayed Ibrahim Hashimi
Avoir votre point de vue le modèle de la carte un-à-un avec votre modèle de domaine.
Spécifier
Model
comme argument pour larouteValues
comme ci-dessous. Cela signifie que votre modèle de vue sera initialisé avec les valeurs du modèle de domaine. Seul le sous-ensemble de champs dans le formulaire seront remplacées dans lapersonViewData
.Mettre À Jour La Vue:
ProfileController:
OriginalL'auteur Troels Wittrup
Pourquoi n'utilisez-vous pas tryupdatemodel pour mettre avec le formulaire de collecte.
Si votre vue est l'édition d'une personne
Et votre point de vue est seulement la modification de nom et de prénom, vous pouvez le faire:
Qui ne mettra à jour que Personne avec les éléments qu'une partie de la collection de formulaire. Si vous ne voulez pas un champ mis à jour, ne pas le soumettre avec le formulaire.
OriginalL'auteur Odd
Que si vous avez plein de modèle, mais chaque page utilise et met à jour uniquement la partie nécessaire? Puis vous mettre à jour le modèle d'affaires à l'aide d'une vue complète des données à la dernière page.
Non, je ne pense pas qu'il l'est. Je pense qu'il suggère de ne pas utiliser un viewmodel. Tout simplement passer le modèle complet et l'action seulement changer/mettre à jour les propriétés que vous en avez besoin. Simplifier le processus en enlevant le surplus de plomberie de la machine virtuelle de l'objet.
Donc, concernant le peu de mise à jour du modèle d'affaires à l'aide de vue d'ensemble de données à la dernière page", alors?
OriginalL'auteur queen3
y, viewmodel + automapper.
ps. un modèle compliqué, tend à compliquer ... tout est-il vraiment la peine dans votre scénario?
OriginalL'auteur eglasius
Je utiliser une approche similaire à la vôtre (dans mon cas, Entity Framework) avec Entity -> ViewModel -> Afficher mais seulement sur les points de vue avec le "complexe" des entités qui ont soit 1:M:M relations. Dans la plupart des cas, j'ai pris le bas de la route et est allé pour Entity->Afficher lorsque j'ai une simple entité.
Mon ViewModel est défini comme une Entité+soutien propriétés:
SelectList
ouMultiSelectList
et unstring
ouList<string>
. Je vais aussi utiliser un ViewModel pour les instances où j'ai propriétés dont j'ai besoin pour la vue, mais ne doit pas nécessairement dans l'entité (base de données).Http Get contrôleur méthodes sont simples ActionResults avec
return View(repository.FetchNewViewModel())
pour Créer ourepository.FetchModelById(id)
pour le Modifier. Dans les deux cas, je suis de l'initialisation de mes entités avant de passer à la vue.Create([Bind(Exclude = "Entity.EntityId")] ViewModel model)
etEdit(ViewModel model)
sont Http Post méthodes de contrôleur de Créer et de Modifier des. Ma vue modification a un champ caché pour EntityId pour passer d'avant en arrière.Par le temps de la méthode Http Post a le viewmodel, je perds toute Entité.Relation et ViewModel.(Multi)SelectList valeurs. J'ai pour reconstruire l'objet, si je veux que mon point de vue à afficher correctement:
`
`
Il y a peut-être 30% de mon entité de base à l'aide d'un ViewModel donc je ne l'utiliser comme nécessaire. Si vous avez des vues complexes et le modèle de données dans la plupart des cas, vous pouvez probablement briser à petites vues.
OriginalL'auteur w0rd-driven
Droit maintenant, je travaille sur un grand projet à l'aide de S#arp Architecture et im aussi à l'aide de l'approche:
- Je utiliser le ViewModel pour la Liaison de la partie et les Validations, l'autre approche est d'utiliser le Modèle Directement (avec tryupdatemodel pour mettre /UpdateModel que nous avons utilisé pendant le prototype de développer), mais pour des scénarios complexes-nous à la fin du temps de traitement de la situation particulière comme SelectLists/Case/Projections/HMAC Validations dans un peu ViewModel de toute façon et en utilisant beaucoup de Demande.Form["clé"] =( , l'autre inconvénient est de gérer les erreurs des situations où vous voulez le remplir de nouveau le formulaire avec l'entrée de l'utilisateur, je l'ai trouvé un peu plus compliqué en utilisant le Modèle directement (à l'aide d'un ViewModel nous prenons beaucoup de l'avantage de l'ModelState tentative de valeur, nous permet d'économiser un couple de voyages à la DB, ceux qui ont du faire face à ce scénario, vous savez ce que je veux dire).
Cette approche est un peu long, tout comme vous l'avez dit, vous vous retrouvez de propriétés correspondantes, mais à mon avis c'est le chemin à parcourir pour les formes complexes.
Il est intéressant de mentionner que nous venons d'utiliser Viewmodel pour le Créer/Modifier des scénarios, pour presque tout le reste, nous utilisons directement le modèle.
Je n'ai pas utiliser autommapers jusqu'à présent, mais certainement je ll lui donner un essai.
OriginalL'auteur JOBG