asp.net c# MVC: Comment puis-je vivre sans ViewState?

je suis juste à la recherche de convertir les formulaires Web en MVC:

.net MVC, quels concepts ViewState quelque chose qui n'est pas nécessaire?

si un formulaire est posté sur iteself etc (c'est-à-dire un postback)? comment la page / usercontrol maintient-elle son état?

que font les gens pour maintenir une sorte d'état et ne pas recourir à l'état de session?

sûrement, un environnement totalement apatride existent-ils?

52
demandé sur jan 2010-02-09 19:11:32

13 réponses

mais bien sûr que si. En fait, le web est apatride. Toute pensée contraire est l'aberration, en fait.

les commandes Web ont disparu dans MVC. Il n'y a pas d'événements de tir sur le côté serveur. Ceci est remplacé par deux mécanismes différents--URLs et affichage des données du formulaire. Une utilisation appropriée de ceux-ci remplacera votre besoin pour le ViewState.

dans un ASP.NET application web, vous placeriez un bouton de lien sur votre page Web qui exécuterait la fonction X. ASP.NET collerait beaucoup de viewstate cruft, javascript et d'autres choses dans la page Web de sorte que, lorsque l'utilisateur clique sur le bouton et "messages de retour" sur le site web (en soumettant un formulaire personne ne sait existait), ASP.NET reconstruit ce qui s'est passé et détermine qu'un bouton particulier du gestionnaire d'événements doit être exécuté.

dans MVC, vous construisez votre lien pour accéder à un itinéraire particulier. L'itinéraire décrit ce que l'utilisateur souhaite --/Utilisateurs/Souffrance/Index (afficher une liste de tous les utilisateurs). Le système d'acheminement dans MVC détermine quel contrôleur va gérer cette route et quelle méthode sur ce contrôleur va exécuter. Toute information supplémentaire peut être transmise à la méthode controller par les valeurs de la chaîne de requête URL (?Page=5 pour la 5ème page des délinquants).

en plus des URLs, vous pouvez utiliser des formulaires HTML pour afficher des informations plus complexes (comme la valeur d'un formulaire de données) ou des choses qui ne rentre pas dans une chaîne de requête, tel qu'un fichier.

ainsi vous" maintenez " l'état via les chaînes de requête et formez les valeurs de POST. Vous constaterez qu'en fait, il n'y a pas beaucoup d'État à maintenir à la fin. En fait, avoir à maintenir beaucoup d'état est une bonne indication que votre conception fait défaut ou que vous essayez de faire quelque chose qui ne correspond pas à un modèle de site web.

78
répondu Will 2010-02-09 16:24:28

Certaines questions connexes:


dans la plupart des langages web traditionnels, le concept d'un environnement stable est en fait assez rare. ASP.NET Webforms est une exception à la règle et il crée cette exception par réinventer beaucoup de normes. Le but des formulaires Web est essentiellement de faire abstraction du concept de développement HTML et web en général, de sorte que la ligne de démarcation entre l'application bureautique et l'application web s'estompe du point de vue du développement. Ce que cela signifie généralement, c'est que la solution ASP.NET Webforms fournit, bien qu'efficace, est un jack-of-all-trades implémentation qui résulte en une sortie très verbeux qui fonctionne assez bien pour satisfaire la plupart. Inversement, l'avantage de base de ASP.NET MVC est qu'il donne le contrôle de sortie HTML de nouveau pour le développeur et leur permet de créer fortement-architecte, Reposful applications web qui sont mieux définis et plus propres dans leur mise en œuvre et la présentation - malgré sacrifier un certain niveau de commodité.

sans doute, l'un des plus grands inconvénients du modèle des formulaires Web est le ViewState parce qu'il encombre la sortie, augmente la taille de la page de façon spectaculaire dans certains scénarios, et est souvent l'équivalent d'utiliser un marteau-piqueur pour accrocher une image. Plutôt que d'essayer de faire usage de ViewState dans votre application MVC (ou quelque chose qui lui ressemble), vous devriez commencer à utiliser des modèles qui contrôlent explicitement les champs dans vos formes et optimiser vos opérations d'entrée et de sortie avec seulement les données les plus pertinentes. En plus des changements dans le balisage, vous apprendrez également à construire des solutions mieux conçues qui peuvent être exposés dans votre application et à l'extérieur.

la comparaison numéro un que j'aime faire est tout simplement: les formulaires Web construisent des Pages Web, mais MVC construit des Applications Web. Si votre travail quotidien consiste principalement à construire des éléments d'un site web, ou à ajouter de petits morceaux de fonctionnalité, vous trouverez souvent que les formulaires Web sont beaucoup plus faciles et prennent moins de temps; d'un autre côté, si vous voulez construire une application complète qui est testable, évolutive et flexible, MVC est votre appel.

12
répondu Nathan Taylor 2017-05-23 12:17:11

viewstate est juste un grand, moche champ de forme cachée.

écrivez vos propres champs de formulaire cachés, et cryptez-les si vous le devez.

heureusement, il n'y a plus de moyen simple de jeter des tas et des tas de données dans la page, donc vous devez être judicieux sur ce que vous voulez sauver.

9
répondu Rob Fonseca-Ensor 2010-02-09 16:41:00

si un formulaire est affiché de nouveau sur lui-même, etc. (c'est à dire un postback)? comment l' page/usercontrol maintenir son état? Que font les gens pour maintenir une sorte d'état et ne pas recourir à l'état de session?

les ViewData affichés (ou l'objet fortement dactylographié lié à la page) peuvent être repoussés à la vue à nouveau. Voir "Integrating Validation and Business Rule Logic with Model Classes" dans cette page. il montre comment vous pouvez afficher un formulaire, le valider et retourner les champs dans le formulaire si une erreur se produit.

.net MVC, quels concepts ViewState quelque chose qui n'est pas requis?

transfert D'État représentatif (REST).

4
répondu Robert Harvey 2010-02-09 16:27:24

MVC a certains avantages par rapport aux formulaires Web, mais il a également certains inconvénients ainsi que je couvert en détail dans cette réponse . Je pense que la question fondamentale que vous devez vous poser est de savoir si ViewState est un problème pour vous maintenant - et est-ce un tel problème que vous devez réécrire votre application? Si non, alors apprendre MVC est un objectif louable (il est vraiment assez cool) mais pas un que je risquerais affaires pour.

Cela étant dit, ViewState peut en fait être désactivé dans un nombre étonnamment élevé de cas. Il est utilisé principalement pour maintenir la valeur des contrôles par le biais d'un post-back. Ainsi, par exemple, si vous avez une zone de texte dont vous devez cocher la valeur du côté du serveur ainsi qu'un tas d'autres champs, ViewState vous permettra de gérer le post-back, attraper l'erreur (et afficher une étiquette) et ensuite retourner l'utilisateur au formulaire avec toutes ses entrées intactes. Toutefois, si un formulaire est seulement va être rempli et retourné et vous serez alors rediriger vers une autre page, vous pouvez désactiver en toute sécurité.

enfin, vous demandez ce que les gens font pour éviter L'état de Session. Est-il une raison pour éviter l'état de session? Surement vous ne voulez pas beaucoup d'information là-bas mais l'éviter tout à fait est vraiment pas nécessaire et, en fait, va vous coûter l'un des outils les plus puissants de votre arsenal.

3
répondu Mark Brittingham 2017-05-23 12:31:55

toutes les réponses disant que ASP.NET MVC n'utilise pas l'état sont à peu près corrects. Mais ASP.NET MVC utilise en fait un certain état, bien qu'il ne fonctionne pas quelque chose comme ViewState.

habituellement, quand quelqu'un poste des données à votre application, vous voudrez valider les données et afficher une erreur si les données ne sont pas valides. Cependant, si vous retournez la page contenant le message d'erreur immédiatement, lorsque L'utilisateur clique sur F5 pour recharger la page, les données seront être soumis à nouveau. Ce n'est généralement pas ce que vous voulez. Ainsi, lorsque vous réalisez que les données postées ne sont pas valides, vous voulez dire aux utilisateurs D'obtenir la page (ou peut-être une autre page) et afficher un message d'erreur. Vous faites cela en retournant un code de statut de redirection HTTP. Cependant, une fois que la requête GET de l'utilisateur est arrivée, comment savez-vous quel message d'erreur afficher? Vous devrez vous en souvenir d'une façon ou d'une autre à partir du moment où vous (le serveur) manipulez le POST jusqu'à ce que vous manipuliez L'GET.

pour ce faire, vous utilisez un ASP.NET MVC fonctionnalité appelée TempData. Il s'agit en fait juste d'une session wrapper around qui garantit que tout ce que vous enfoncez dans le dictionnaire TempData y restera jusqu'à la prochaine requête et plus.

3
répondu Rune 2010-02-18 22:36:33

considérer le fait que le mouvement de repos dans la programmation web est fondé sur l'idée que l'état est mauvais pour un programme. La Wikipédia a une description décente avec des références: http://en.wikipedia.org/wiki/Representational_State_Transfer

en provenance de tranditional ASP.NET et le modèle d'événement riche qu'il fournit, MVC peut être tout à fait bouleversant. ne nécessitent la gestion de certaines choses qui ont été invisible pour vous avant, mais je pense que la valeur en termes de testabilité (les pages de repos peuvent être déclenchées facilement sans créer un viewstate complexe et par définition le serveur n'est pas l'état de conservation de sorte que je peux tester une page/fonctionnalité en isolation) offsets la courbe d'apprentissage.

pour une discussion de MVC dans ASP.NET et repos: http://blog.wekeroad.com/2007/12/06/aspnet-mvc-using-restful-architecture /

2
répondu Godeke 2010-02-09 17:00:00

L'état est le modèle qui est dans la base de données. Vous pouvez soigneusement mettre en cache la base de données pour réduire les temps de chargement de page.

0
répondu Tamas Czinege 2010-02-09 16:18:04

l'état de vue généré automatiquement n'existe pas dans MVC, mais vous pouvez écrire votre propre simplement en utilisant des champs cachés,

dans MVC vous ne verrez pas beaucoup de caractères cryptés en haut de la page que vous n'avez pas besoin de la plupart d'entre eux.

0
répondu Amr Elgarhy 2010-02-09 16:25:50

en fait, si. Vous devez oublier la façon dont la persistance a été inventée avec le viewstate.

vous devez également convertir dans votre esprit postback sur une page pour"appeler à un contrôleur". De cette façon, les choses seront plus faciles à comprendre par la suite. Au lieu d'appeler une page , vous appelez un contrôleur qui renvoie une vue. Donc soit vous construisez votre "page" entière encore et encore à chaque appel, ou vous décidez de traiter seulement avec ce qui est vraiment touché par le action. Si le bouton change un div, pourquoi recharger la page entière. Il suffit de faire appel à votre contrôleur et de retourner ce qui devrait être les nouvelles données dans votre div.

par exemple, imaginons un scénario maître/détail:

<h2>Groups</h2>
    <div id="GroupList">
    </div>
    <div id="GroupDetail" title="Detail Group">
</div>

la liste du groupe est chargée une fois dans le div et il est-ce qu'un appel ajax est possible à un controller pour chaque élément de la liste du groupe:

<%= Ajax.ActionLink("Edit", "DetailLocalisationGroup", 
                     new { id = group.Id }, 
                     new AjaxOptions() { 
                         UpdateTargetId = "DetailLocalisationGroup", 
                         OnSuccess = "InitialisationDetailGroup" })%>

qui appelle cette action DetailLocalisationGroup qui est d'alimenter le groupe divdetail avec html.

[AcceptVerbs("POST")]
public ActionResult DetailLocalisationGroup(int id)
{
    LocalisationGroup group = servicelocalisation.GetLocalisationGroup(id);
    return View("DetailGroup", group);
}

il y a maintenant un formulaire dans le div, et en appuyant sur le bouton Soumettre de ce formulaire, nous envoyons simplement les informations dont nous avons vraiment besoin à un contrôleur qui enregistrerait alors les données dans la base de données.

au cours de tous ces événements, le GroupList a été rempli de choses qui étaient affichées sur l'écran du client, mais aucune interaction n'était nécessaire là-bas et donc pourquoi se déranger avec un état d'affichage de ces...

0
répondu Arthis 2010-02-09 17:19:36

vous pouvez imiter l'état de vue avec mvc3futures projet . Il sauvera le modèle entier en vue.

Tout ce que vous avez à faire est de sérialiser modèle et de le chiffrer.

@Html.Serialize("Transfer", Model, SerializationMode.EncryptedAndSigned)

et dans controller ajouter attribut désérialisé.

public ActionResult Transfer(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Transfer transfer)
0
répondu jan salawa 2013-03-20 08:29:41

après avoir lu tous ces messages, il semble que MVC n'est pas bon pour le type D'applications LOB, où vous aurez beaucoup de contrôles et, opérations CRUD et vous voulez maintenir l'état des contrôles. Il y a beaucoup de raisons pour lesquelles vous voulez que l'utilisateur reste dans le même état de view & maintain après que les opérations de submit sont effectuées. Par exemple pour afficher des erreurs, des messages de validation côté serveur, des messages de succès, ou pour effectuer toute autre action. redirigeant l'utilisateur vers une autre vue pour afficher ces messages ne sont pas pratiques.

0
répondu LP13 2015-04-20 18:39:18

vous pouvez stocker n'importe quel objet dans l'état de session.

 HttpContext.Session["userType"] = CurrentUser.GetUserType();
0
répondu fireydude 2015-07-22 13:03:23