Jak zachować tekst pola tekstowego tylko do odczytu po PostBack()?

Mam ASP.NET TextBox i chcę, żeby tak było ReadOnly. (Użytkownik modyfikuje go za pomocą innej kontrolki)

Ale gdy jest PostBack(), tekst jest resetowany do pustego ciągu.

Rozumiem, że jeśli ustawisz Właściwość ReadOnly na True z TextBox to jej zawartość nie zostanie zapisana przez PostBack().

Czy istnieje sposób, aby zachować zawartość po PostBack() i sprawić, aby TextBox nie był edytowalny przez użytkownika?

Próbowałem ustawić właściwość Enabled na False, ale nadal zawartość nie zapisuje po PostBack().

Author: Frost_Mourne, 2011-09-27

7 answers

Inne rozwiązanie, które znalazłem i łatwiejsze:

Dodaj to do metody ładowania strony:

protected void Page_Load(object sender, EventArgs e)
{
     TextBox1.Attributes.Add("readonly", "readonly");
}
 51
Author: Youssef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 04:58:18

Niech twoja druga kontrolka przechowuje wartość w ukrytym polu, a w postback wyciągnij wartość z ukrytego pola i wepchnij ją do pola tekstowego po stronie serwera.

 6
Author: The Evil Greebo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-27 14:21:39

txtStartDate.Attributes.Add("readonly", "readonly"); Na pageload w najlepszych z najlepszych rozwiązań, zamiast lub Javascripts, Ukryte zmienne, cache, cookies, sesje & Cache.

 2
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-24 17:15:48

Uzyskaj wartość za pomocą Request.Form[txtDate.UniqueID]. Dostaniesz to !!

 1
Author: Nitin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-11 11:31:11

Miałem ten sam problem, ale używając wiązania Knockout 'enable' i ASP.Net tekst sterujący serwerem.

W ten sposób:

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

Jednakże, gdy formularz został przesłany, wartość tego pola była zawsze pusta. Przypuszczam, że tak się stało, ponieważ jeśli kontrolka jest wyłączona, to nie jest ona persist w łańcuchu ViewState.

Rozwiązałem zastąpienie bindig 'enable' przez ' 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
Author: Rodrigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-09 22:38:39

Oto sposób, aby to zrobić z javascript w zdarzeniu onfocus samego Textboxa.

Robienie tego w ten sposób z javascript ma tę zaletę, że nie trzeba tego robić w kodzie za, co może być trudne, jeśli trzeba to zrobić w gridviews lub podobne.

Ten kod javascript jest testowany tylko na Internet Explorerze i niektóre jego części będą działać tylko na IE, jak na przykład część createTextRange, która jest tam tylko po to, aby karetka skończyła się na początku tekstu w polu tekstowym, ale tę część można pominąć, jeśli nie jest to konieczne.

Jeśli rdzeń tej techniki działa na innych przeglądarkach, powinno być możliwe, aby Kod był cross browser. Sednem tego pomysłu jest rozmycie po ustawieniu readonly, a następnie timeout, aby ponownie ustawić ostrość.

Jeśli ustawisz tylko readonly, to nie stanie się tylko readonly, dopóki następnym razem nie podasz pola tekstowego.

I oczywiście kod można umieścić w funkcji, która jest wywoływana z "to" jako 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
Author: Magnus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 04:41:26

Ustaw właściwość ContentEditable textbox na false ContentEditable= "false".. Nie pozwala na edycję zawartości pola tekstowego ie; sprawi, że pole tekstowe będzie tylko odczytywane i również spowoduje, że wartość pozostanie w polu tekstowym po postback.. Myślę, że to najłatwiejszy sposób..

 -1
Author: sona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-10 12:46:23