2010-08-11 3 views
4

Je dois construire quelques vues partielles ascx dans mes applications MVC pour encapsuler des fonctionnalités réutilisables ainsi qu'archiver SOR et SOC. Cependant, j'ai rencontré défi comment encapsuler la logique métier qui conduit les vues MVC ascx.MVC: Comment encapsuler la logique dans MVC ascx vue partielle avec la même efficacité des contrôles ascx webforms?

Dans les formulaires Web, le code d'un contrôle ASCX peut gérer un événement de clic de bouton et le navigateur affiche toujours la même page avec une seule publication. Comment puis-je archiver la même chose dans MVC? Quand ~/Address/Edit/2 inclut une vue ascx partielle avec un bouton qui appelle une autre action MVC - disons ~/ShareController/CommonAction - quel est le meilleur moyen pour que CommonAction retourne à la même vue qui inclut le fichier ascx? Peut-être qu'il me manque un modèle commun dans le développement Web MVC?

Merci,

Max

Mise à jour: Voici une description plus sur le modèle que je cherche:

La vue partielle censé être un éditeur d'adresses. Il peut valider l'adresse, afficher les erreurs de validation et sauvegarder les informations dans la base de données.

L'éditeur d'adresse va s'asseoir sur de nombreuses pages avec différentes commandes/actions.

Dans un formulaire Web classique, un contrôle ascx peut parfaitement interagir avec l'utilisateur par lui-même via de nombreuses publications sans modifier l'URL qui perturbe le processus de page global. Quel est le bon modèle pour le scénario similaire dans MVC?

Mise à jour 2:

Je ne sais pas que cela n'a rien à voir avec le statefullness de formulaire en ligne. Fonctionnalité totalement différente. Il s'agit d'un contrôleur qui appelle un autre sous-contrôleur (ou contrôleur enfant) pour gérer une vue partielle. Voyez mon exemple à la fin de ce commentaire. Je veux juste atteindre le même niveau d'encapsulation et de séparation d'inquiétude. Si le framework MVC n'a pas ça, c'est une faiblesse sérieuse.

Dans MVC, comment pourrions-nous avoir une "chose" (ou une vue partielle faute de meilleure alternative) capable de gérer la présentation ainsi que la logique et de résider dans une autre page parent sans interférer? D'après ce que je comprends, les vues partielles dans MVC sont juste une présentation qui ne peut pas avoir un contrôleur dédié sans interférer avec le contrôleur principal. J'espère que je me suis trompé

Pour vous donner un autre exemple, considérez cette page que vous lisez "stackoverflow.com/questions/{id". Il inclut un composant "Ajouter un commentaire". Le commentaire d'ajout peut effectuer une validation côté serveur pour empêcher les commentaires non valides. Comment pouvez-vous créer un composant "Ajouter un commentaire" de bout en bout pouvant résider sur n'importe quelle page et gérer la logique de contrôleur nécessaire? La seule façon que je peux penser est de modifier le contrôleur de la page d'accueil pour pouvoir donner des messages de validation d'utilisateur et leur demander de corriger les erreurs par la poste. Cela signifie que vous ajoutez le composant à 10 pages différentes, vous devez modifier 10 contrôleurs différents. Cela tue "DRY"

JE VEUX QUE J'AI FAUT! parce que j'aime MVC sofar.

Conclusion:

Je marqué la réponse de Kenny comme la réponse; cependant, je considérerais ceci comme une faiblesse sérieuse du cadre MVC du point de vue de l'encapsulation, de la réutilisabilité et du principe DRY. Mon opinion n'a rien à voir avec l'état de forme des webforms.

S'il vous plaît, permettez-moi d'expliquer:

En webforms, vous pouvez 100% encapsuler une fonctionnalité complexe dans un contrôle ascx et des DLL Classlib liées au cours. Un (1) développeur peut passer des semaines à le développer. Une fois son travail terminé, personne n'a besoin de savoir quoi que ce soit et de l'utiliser. Le contrôle de l'utilisateur peut être réutilisé sur de nombreuses pages sans déranger les autres "développeurs" avec les activités de détail qui ont lieu dans le composant ascx.

En revanche, vous ne pouvez jamais obtenir la même chose avec ASP.NET MVC où l'ascx partial doit interagir avec l'utilisateur. Une fois que l'ascx a besoin d'interagir, il a besoin de son propre contrôleur et le contrôleur doit conserver le ModelState.

Jeremy Skinner a présenté le [ModelStateToTempData] dans MvcContrib: http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/ Cependant, cela est juste un patch. Un bon framework devrait permettre au développeur d'encapsuler à 100% son travail - dans un contrôle, partiel, asc ou quoi que ce soit - et l'avoir au reste de l'équipe pour qu'ils puissent «l'utiliser» sans connaître aucune donnée. Winform fournit parfaitement cela dans de nombreux scénarios complexes.

Tout bienvenu.

+0

Quelle est la vue partielle utilisée dans votre scénario spécifique? Quel est le but du bouton clic? –

+0

Salut Jeff, Juste ajouté plus de commentaires. Merci. – DevTeach2010

Répondre

0

Je ne sais pas si votre problème est à 100% mais vous ne pouvez pas fournir à UserControl les données dont vous avez besoin?

Transmettez un <% = Url.Action()%> auquel l'envoi va à lorsqu'il est cliqué. Si vous voulez que la page redirige vers la même page que vous étiez, vous pouvez rediriger et réenregistrer votre ModelState (http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx astuce # 13). La redirection peut être faite referrer ou en envoyant le nom de l'action et du controller à votre méthode d'action.

Si cela ne fonctionne pas, vous pouvez toujours utiliser Ajax?

+0

Salut Kenny, Merci pour l'aide. Le lien que vous m'avez référé dit: "Le projet MVCContrib a aussi cette fonctionnalité mais ils le font en une seule classe que je n'aime pas" Savez-vous quelle est la fonctionnalité exacte de MVCContrib? Merci encore. – DevTeach2010

+0

Oui, ils utilisent le filtre ModelStateToTempData. –

0

Je suis presque sûr que ce n'est pas comme cela que c'est "supposé" être fait, mais je regarde habituellement l'URL du referer et redirige là.

+0

La redirection ne fonctionne pas lorsque la vue partielle doit afficher un retour de validation via quelques publications. Lorsque vous redirigez ModelState est parti. – DevTeach2010

+0

Il semble que vous soyez bloqué avec le paradigme «stateful» de WebForms. Étant une tentative de faire en sorte que l'application Web fonctionne «tout comme» l'application Windows du point de vue du développeur, elle dépend fortement de la mémorisation de l'état du formulaire entre les demandes. MVC, d'autre part, prend une application web pour ce qu'elle est: une série de demandes indépendantes. Vous devez concevoir votre application de manière à ne pas exiger d'état. –

+0

Fyodor: S'il vous plaît voir ma 2ème mise à jour ci-dessus – DevTeach2010

0

Je pense que la façon correcte de gérer ce type de fonctionnalité dans MVC (et pratiquement toute autre chose qui n'est pas webforms) est via un appel ajax. Créer une publication à pleine page serait gênant, comme vous l'avez vu. Vous pouvez, cependant, accomplir tout ce que vous voulez en incorporant votre opération de post et l'affichage des erreurs de validation dans une opération ajax qui ne met à jour que la partie de la page qui contient le contrôle, et non la page entière.

0

Je suis à la recherche de la même chose et je suis tombé sur Html.Action et .RenderAction qui semblent exécuter le contrôleur sur le serveur et retourner/injecter la sortie.

Cela pourrait être utilisé pour les encapsulations et la réutilisabilité dans MVC, mais je n'ai pas encore essayé.

Questions connexes