J'essaye de construire une "micro-webapp" très, très simple qui, je soupçonne, sera intéressante pour quelques Stack Overflow'rs si jamais je le fais. Je l'héberge sur mon site C # in Depth, qui est vanilla ASP.NET 3.5 (c'est-à-dire pas MVC).
Le déroulement est très simple:
- Si un utilisateur entre dans l'application avec une URL qui ne spécifie pas tous les paramètres (ou si l'un d'entre eux n'est pas valide), je souhaite simplement afficher les contrôles d'entrée utilisateur. (Il n'y en a que deux.)
- Si un utilisateur entre dans l'application avec une URL qui contient tous les paramètres requis, je souhaite afficher les résultats et les contrôles d'entrée (afin qu'ils puissent modifier les paramètres)
Voici mes exigences auto-imposées (mélange de conception et de mise en œuvre):
- Je souhaite que la soumission utilise GET plutôt que POST, principalement pour que les utilisateurs puissent facilement ajouter la page à leurs favoris.
- Je ne veux pas que l'URL finisse par avoir l'air idiot après la soumission, avec des morceaux superflus. Juste l'URL principale et les vrais paramètres s'il vous plaît.
- Idéalement, j'aimerais éviter de nécessiter JavaScript. Il n'y a aucune bonne raison pour cela dans cette application.
- Je veux pouvoir accéder aux contrôles pendant le temps de rendu et définir les valeurs, etc. En particulier, je veux pouvoir définir les valeurs par défaut des contrôles sur les valeurs de paramètres transmises, si ASP.NET ne peut pas le faire automatiquement pour moi (dans les autres restrictions).
- Je suis heureux de faire toute la validation des paramètres moi-même et je n'ai pas besoin de beaucoup d'événements côté serveur. Il est très simple de tout définir lors du chargement de la page au lieu d'attacher des événements à des boutons, etc.
La plupart de cela est correct, mais je n'ai trouvé aucun moyen de supprimer complètement l'état d'affichage et de conserver le reste des fonctionnalités utiles. En utilisant l'article de cet article de blog, j'ai réussi à éviter d'obtenir une valeur réelle pour l'état d'affichage - mais cela finit toujours comme un paramètre sur l'URL, ce qui semble vraiment moche.
Si j'en fais un formulaire HTML simple au lieu d'un formulaire ASP.NET (c'est-à-dire retirer runat="server"
), alors je n'obtiens aucun état de vue magique - mais alors je ne peux pas accéder aux contrôles par programme.
Je pourrais faire tout cela en ignorant la plupart d'ASP.NET et en créant un document XML avec LINQ to XML et en l'implémentant IHttpHandler
. Cela semble un peu bas cependant.
Je me rends compte que mes problèmes pourraient être résolus soit en relâchant mes contraintes (par exemple en utilisant POST et en ne se souciant pas du paramètre excédentaire) ou en utilisant ASP.NET MVC, mais mes exigences sont-elles vraiment déraisonnables?
Peut-être qu'ASP.NET ne se réduit tout simplement pas à ce type d'application? Il y a cependant une alternative très probable: je suis juste stupide, et il y a un moyen parfaitement simple de le faire que je n'ai tout simplement pas trouvé.
Des pensées, quelqu'un? (Cue des commentaires sur la manière dont les puissants sont tombés, etc.
Réponses:
Cette solution vous donnera un accès par programme aux contrôles dans leur intégralité, y compris tous les attributs des contrôles. De plus, seules les valeurs de la zone de texte apparaîtront dans l'URL lors de la soumission, de sorte que l'URL de votre demande GET sera plus «significative»
Ensuite, dans votre code-behind, vous pouvez faire tout ce dont vous avez besoin sur PageLoad
Si vous ne voulez pas d'un formulaire qui a
runat="server"
, vous devez utiliser des contrôles HTML. Il est plus facile de travailler avec vos besoins. Utilisez simplement des balises HTML ordinaires et mettezrunat="server"
-leur un identifiant. Ensuite, vous pouvez y accéder par programme et coder sans fichierViewState
.Le seul inconvénient est que vous n'aurez pas accès à la plupart des contrôles serveur ASP.NET «utiles» comme
GridView
s. J'ai inclus unRepeater
dans mon exemple car je suppose que vous voulez que les champs soient sur la même page que les résultats et (à ma connaissance) aRepeater
est le seul contrôle DataBound qui s'exécutera sansrunat="server"
attribut dans la balise Form.la source
Vous êtes définitivement (à mon humble avis) sur la bonne voie en n'utilisant pas runat = "server" dans votre balise FORM. Cela signifie simplement que vous devrez extraire directement les valeurs de Request.QueryString, comme dans cet exemple:
Dans la page .aspx elle-même:
et dans le code-behind:
L'astuce ici est que nous utilisons des littéraux ASP.NET dans les attributs value = "" des entrées de texte, de sorte que les zones de texte elles-mêmes n'ont pas à runat = "server". Les résultats sont ensuite encapsulés dans un ASP: Panel et la propriété Visible est définie lors du chargement de la page selon que vous souhaitez afficher ou non des résultats.
la source
D'accord Jon, le problème de viewstate d'abord:
Je n'ai pas vérifié s'il y avait un quelconque changement de code interne depuis la version 2.0, mais voici comment j'ai géré la suppression de l'état de vue il y a quelques années. En fait, ce champ caché est codé en dur dans HtmlForm, vous devez donc en dériver le nouveau et entrer dans son rendu en effectuant les appels vous-même. Notez que vous pouvez également laisser __eventtarget et __eventtarget si vous vous en tenez aux anciens contrôles d'entrée (ce que je suppose que vous voudriez car cela aide également à ne pas avoir besoin de JS sur le client):
Donc, vous obtenez ces 3 MethodInfo statiques et les appelez en sautant cette partie viewstate;)
et voici le constructeur de type de votre formulaire:
Si je comprends bien votre question, vous ne souhaitez pas non plus utiliser POST comme action de vos formulaires, alors voici comment procéder:
Je suppose que c'est à peu près tout. Faites-moi savoir comment ça se passe.
EDIT: j'ai oublié les méthodes d'affichage de la page:
Ainsi, votre formulaire personnalisé: HtmlForm obtient son tout nouveau résumé (ou non) Page: System.Web.UI.Page: P
Dans ce cas, je scelle les méthodes car vous ne pouvez pas sceller la page (même si elle n'est pas abstraite, Scott Guthrie l'enveloppera dans une autre: P) mais vous pouvez sceller votre formulaire.
la source
Avez-vous pensé à ne pas éliminer le POST mais plutôt à le rediriger vers une URL GET appropriée lorsque le formulaire est POSTÉ. Autrement dit, acceptez à la fois GET et POST, mais sur POST, construisez une requête GET et redirigez-la vers elle. Cela pourrait être géré soit sur la page, soit via un HttpModule si vous vouliez le rendre indépendant de la page. Je pense que cela rendrait les choses beaucoup plus faciles.
EDIT: Je suppose que vous avez EnableViewState = "false" défini sur la page.
la source
Je créerais un module HTTP qui gère le routage (similaire à MVC mais pas sophistiqué, juste quelques
if
déclarations) et le remettrais àaspx
ouashx
pages.aspx
est préférable car il est plus facile de modifier le modèle de page. Je n'utiliserais pasWebControls
dans leaspx
cependant. JusteResponse.Write
.Au fait, pour simplifier les choses, vous pouvez faire la validation des paramètres dans le module (car il partage probablement le code avec le routage probablement) et l'enregistrer
HttpContext.Items
puis les rendre dans la page. Cela fonctionnera à peu près comme le MVC sans toute la cloche et les sifflets. C'est ce que j'ai fait beaucoup avant les jours d'ASP.NET MVC.la source
J'ai vraiment été heureux d'abandonner totalement la classe de page et de gérer chaque requête avec un gros cas de commutation basé sur l'URL. Chaque "page" devient un modèle html et un objet ac #. La classe de modèle utilise une expression régulière avec un délégué de correspondance qui se compare à une collection de clés.
avantages:
déceptions:
Jon, que faisons-nous sur SO un samedi matin :)?
la source
Je pensais que le contrôle asp: Repeater était obsolète.
Le moteur de modèle ASP.NET est sympa mais vous pouvez tout aussi facilement répéter avec une boucle for ...
ASP.NET Forms est en quelque sorte correct, il y a un support décent de Visual Studio mais ce truc runat = "serveur", c'est tout simplement faux. ViewState à.
Je vous suggère de jeter un coup d'œil à ce qui rend ASP.NET MVC si génial, à qui il s'éloigne de l'approche ASP.NET Forms sans tout jeter.
Vous pouvez même écrire vos propres éléments de fournisseur de build pour compiler des vues personnalisées comme NHaml. Je pense que vous devriez chercher ici plus de contrôle et vous fier simplement au runtime ASP.NET pour envelopper HTTP et en tant qu'environnement d'hébergement CLR. Si vous exécutez le mode intégré, vous pourrez également manipuler la requête / réponse HTTP.
la source