web-dev-qa-db-fra.com

Comment conserver le texte d'un TextBox en lecture seule après PostBack ()?

J'ai un ASP.NET TextBox et je le veux ReadOnly. (L'utilisateur le modifie en utilisant un autre contrôle)

Mais quand il y a un PostBack(), le texte est réinitialisé à une chaîne vide.

Je comprends que si vous définissez la propriété ReadOnly sur True d’une variable TextBox, son contenu n’est pas enregistré via PostBack().

Existe-t-il un moyen de conserver le contenu après PostBack() et de rendre la TextBox non modifiable par l'utilisateur? 

J'ai essayé de définir la propriété Enabled sur False, mais le contenu n'enregistre toujours pas après PostBack().

27
Youssef

Une autre solution que j'ai trouvée et plus facile:

Ajoutez ceci à la méthode de chargement de page:

protected void Page_Load(object sender, EventArgs e)
{
     TextBox1.Attributes.Add("readonly", "readonly");
}
55
Youssef

Demandez à votre autre contrôle de stocker la valeur dans un champ masqué et, à la publication, extrayez la valeur du champ masqué et insérez-la dans la zone de texte côté serveur.

6
The Evil Greebo

txtStartDate.Attributes.Add("readonly", "readonly"); sur la page charge dans le meilleur des meilleures solutions, à la place ou Javascripts, variables cachées, cache, cookies, sessions et Caches.

2
Jay

Obtenez la valeur en utilisant Request.Form[txtDate.UniqueID]. Tu l'auras !!

1
Nitin

J'ai eu le même problème mais en utilisant la liaison Knockout 'enable' et le texte de contrôle ASP.Net Server.

Par ici:

<asp:TextBox ID="txtCity" runat="server" required="required" class="form-control" placeholder="City" data-bind="value: city, enable: !hasZipCode()"></asp:TextBox>

Cependant, lorsque le formulaire a été soumis, cette valeur de champ était toujours vide. Je suppose que cela s’est produit, car si le contrôle est désactivé, il n’est pas conservé dans la chaîne ViewState.

J'ai résolu de remplacer bindig 'enable' par 'attr {readonly: hasZipCode}'

    <asp:TextBox ID="txtCity" runat="server" required="required" class="form-control" placeholder="City" data-bind="attr{ value: city, readonly: hasZipCode }">/asp:TextBox>
0
Rodrigo

Voici un moyen de le faire avec javascript dans l'événement onfocus de la zone de texte elle-même. 

Le faire comme ceci avec javascript a l'avantage que vous n'avez pas besoin de le faire dans le code suivant, ce qui peut être difficile si vous avez besoin de le faire dans les vues en grille ou similaires.

Ce code javascript est uniquement testé sur Internet Explorer et certaines parties ne fonctionneront que sur IE, comme par exemple la partie createTextRange qui existe uniquement pour que le curseur se retrouve au début du texte de la zone de texte, mais cette partie peut être sauté si pas nécessaire. 

Si le noyau de cette technique fonctionne sur d'autres navigateurs, il devrait être possible de faire croiser le code du navigateur. L'idée principale ici est le flou après le réglage en lecture seule, suivi d'un délai d'attente pour redéfinir la mise au point. 

Si vous définissez uniquement en lecture seule, la lecture seule ne se produira pas avant la prochaine activation de la zone de texte.

Et bien sûr, le code peut être placé dans une fonction qui est appelée avec "this" comme argument.

  <asp:TextBox 
    ID="txtSomething" 
    runat="server"
    Text='<%# Bind("someData") %>'
    onfocus="
var rng = this.createTextRange();
rng.collapse();
rng.select();
if (this.allowFocusevent=='0') {return;};
this.allowFocusevent='0';
this.readOnly=true;
this.blur();
var that=this;
setTimeout(function(){that.focus()},0);
"
  />
0
Magnus