2009-04-29 13 views
4

J'ai une TextBox désactivée dont je modifie la valeur du côté client avec JavaScript. Lorsque j'essaie de récupérer la valeur côté serveur, elle ne reflète pas la modification effectuée côté client. Si je définis l'attribut enabled de la TextBox sur true, je peux récupérer la valeur, mais l'utilisateur est en mesure de mettre en évidence et de modifier la TextBox.Récupération de la valeur d'un ASP: TextBox

Existe-t-il une manière rationnelle d'empêcher l'utilisateur de se concentrer et de modifier le TextBox?

Répondre

5

Browsers n'affichent pas les valeurs de retour dans les contrôles d'entrée handicapés, que vous avez découvert. La façon la plus simple de contourner ce problème est probablement de se connecter à la soumission de formulaire et de réactiver l'entrée au moment de la soumission du formulaire. l'utilisateur n'aura pas la possibilité d'éditer la valeur, et il devrait être posté avec le reste de la demande.

Une autre solution pourrait consister à injecter un élément caché dans le formulaire; Cela pourrait soit être maintenu par votre script, en miroir de la valeur affichée, ou ajouté à la fin, de la même manière que ci-dessus.

+0

Ce que j'ai fini par faire était ce que Rob a suggéré.J'ai ajouté un asp: HiddenField à la page. Lorsque le JavaScript a modifié la valeur de la zone de texte du côté client, il a également changé la valeur de HiddenField. Ensuite, la nouvelle valeur était accessible côté serveur via HiddenField. C'est un tas de merdos alambiquées, mais c'est pourquoi ils l'appellent brown-field. – Slim

6

Utilisez la propriété ReadOnly de la zone de texte.

Éditer: D'après le commentaire de OP, cela ne fera probablement pas l'affaire.

Edit 2: De DotNetSlackers:

Alors, quelle est la différence entre ces deux propriétés et pourquoi n'existent à la fois? Il y a deux différences entre ces deux propriétés, un trivial différence et une subtile, profonde: une

  1. Les deux propriétés différentes balises émettent. Lorsque vous définissez Activé sur False, le TextBox injecte l'attribut désactivé = "désactivé" dans rendu HTML. Lorsque vous définissez la propriété ReadOlyly sur True, l'attribut readonly = "readonly" est injecté. "
  2. Selon la spécification W3C sur les formulaires HTML, les contrôles désactivés ne sont pas" ", alors que les contrôles en lecture seule PEUVENT être" réussie ". Un contrôle "réussi" est celui dont la paire nom/valeur est renvoyée au navigateur via les en-têtes POST ou la chaîne de requête. Par conséquent, les contrôles désactivés ne sont pas renvoyés à la page ASP.NET, tandis que les contrôles en lecture seule peuvent être, selon sur l'agent utilisateur. (Dans mes tests, à la fois IE 6et FireFox 1.5 envoyer le long de la en lecture seule entrée TextBox.)

......

Si vous rencontrez ce problème dans version ASP.NET 1 .x vous pourriez avoir trouvé la propriété ReadOnly de la TextBox et utilisé cela au lieu de définir Activé sur False. Vous pourriez encore avoir une page de ViewState désactivé et définir un en lecture seule TextBox texte de contrôle Web propriété par programme, car la valeur TextBox est renvoyé par la soumission du formulaire pour en lecture seule contrôles. Cependant, dans la version ASP.NET 2.0, les choses changent juste un peu, comme l'a noté par Rick Strahlin son entrée de blog ASP.NET 2.0 ReadOnly changement de comportement lorsque EnableViewState est faux. Avec 2.0, le comportement de la propriété TextBox controlReadOnly a légèrement changé .De la documentation technique:

La valeur du texte d'un contrôle TextBox avec la propriété ReadOnly définie sur true est envoyé au serveur lorsqu'un postback se produit, mais le serveur ne pas de traitement pour une zone de texte en lecture seule. Cela empêche un utilisateur malveillant de modifier une valeur de texte en lecture seule. La valeur de la propriété Text est conservée dans l'état d'affichage entre les publications, sauf si elle est modifiée par le code côté serveur.

Ce qui se passe est que le client envoie le long de la valeur de la lecture seule TextBox à travers les valeurs de forme, mais le moteur ASP.NET 2.0 ne prend pas cette valeur et l'affecter au texte propriété de la zone de texte sur postback à aider à protéger contre un utilisateur malveillant changer la valeur TextBox en lecture seule eux-mêmes. Mais cela nous ramène à notre problème précédent - si la valeur n'est pas spécifiée dans la publication (ou est ignoré, dans ce cas) et ViewState est désactivé, la valeur sera perdue. Eep.

Rick'sworkaround était juste manuellement lire la valeur de la requête en-têtes (ce .TextBox1.Text = demande [this.TextBox1.UniqueID];), ce qui pose un risque de sécurité et pose le problème que 2,0 adresses. L'approche optimale consiste à requery la valeur de la base de données (ou partout où vous avez initialement la valeur définie par programme pour le TextBox en lecture seule ).

La morale de ce billet de blog est que si vous avez données en lecture seule, vous pouvez utiliser soit sous forme désactivée ou en lecture seule champs, il n'a pas d'importance si vous recevez de nouveau la valeur ou non du champ de formulaire dans les formulaires . Il ne devrait pas d'importance parce que vous ne devriez pas être confiance/en utilisant ces données pour commencer avec! Si vous avez des données en lecture seule, ne le relisez pas à partir d'un flux de données que l'utilisateur final peut bricoler!

Source

+0

Si vous définissez la propriété readonly True, il reste activé, mais bloqué à partir d'entrée de l'utilisateur de la zone de texte. – TheTXI

+0

La définition de ReadOnly sur false est identique à la définition de false. – Slim

+0

Eh bien, si c'est le cas, alors j'ai perdu beaucoup de respect pour la propriété ReadOnly. – TheTXI

Questions connexes