2009-05-28 14 views
5

Sto impostando il valore di una casella di testo tramite javascript lato client. Quando aggiorno la pagina il valore è perso.Casella di testo ASP.NET che perde valore dopo il postback quando il valore viene modificato lato client tramite javascript

La casella di testo non è disabilitata o impostata in sola lettura.

Ho letto suggerimenti per mettere il valore in un campo nascosto, preferirei non farlo. Sembra un hack.

La casella di testo è in un controllo utente come tale:

<div id="Row" class="RaidRow" runat="server"> 
    <asp:Button ID="RaidRowButton" runat="server" CssClass="RaidRowButton" OnClick="RaidRowButton_Click" /> 
    <asp:TextBox ID="CharacterNameTextBox" runat="server" CssClass="RaidRowControl SlotTextBox" MaxLength="12" /> 
    <asp:Label ID="ClassNameLabel" runat="server" CssClass="RaidRowControl ClassLabel" /> 
</div> 

Questo controllo è sulla pagina aspx.

Quando l'utente fa doppio clic nella casella di testo, preme Invio mentre la casella di testo è attivo, o cambia il testo, il seguente JavaScript funzione viene chiamata:

function VerifyCharacter(slotNumber, event) 
{ 
    var enterWasPressed = false; 

    if (event && event.which == 13) 
    { 
     enterWasPressed = true; 
    } 
    else if (window.event && window.event.keyCode == 13) 
    { 
     enterWasPressed = true; 
    } 

    if (event == null || enterWasPressed) 
    { 
     var realmName = 'Lightninghoof'; 

     var characterNameTextBox = GetCharacterNameTextBox(slotNumber); 
     characterNameTextBox.style.color = '#CCCCCC'; 

     var classLabel = GetClassNameLabel(slotNumber); 
     classLabel.style.color = '#CCCCCC'; 
     classLabel.innerHTML = 'Unknown'; 

     WoW_Stats.CharacterInformation.GetCharacterInformation(realmName, characterNameTextBox.value, slotNumber, GetCharacterInformation_Success, GetCharacterInformation_Failed); 
    } 
} 

volta che la chiamata web-service è completa, il seguente funzione javascript si chiama:

function GetCharacterInformation_Success(characterInformationResult) 
{ 
    var characterInfo = Sys.Serialization.JavaScriptSerializer.deserialize(characterInformationResult, true); 

    var classLabel = GetClassNameLabel(characterInfo.SlotNumber); 
    classLabel.style.color = characterInfo.ClassColor; 
    classLabel.innerHTML = characterInfo.ClassName; 

    var characterNameTextBox = GetCharacterNameTextBox(characterInfo.SlotNumber); 
    characterNameTextBox.style.color = characterInfo.ClassColor; 
} 

l'unico problema è che quando mi aggiorna la pagina, il testo nel CharacterNameTextBox e ClassNameLabel, cui sono stati posizionati sul lato client tramite javascript, si perdono.

Come posso essere sicuro che i controlli mantengano il loro valore tra i postback?

+1

è un o ? Hai attributo runat = "server"? –

risposta

8

L'aggiornamento della pagina (premendo F5) è diverso da un postback. Non credo che il valore nella tua casella di testo verrà postato sul server durante l'aggiornamento. Il valore nella casella di testo verrà comunque reindirizzato al server su un postback (a condizione che l'attributo ReadOnly di TextBox non sia impostato su true, ma questa è una storia diversa).

+0

Questo è risultato essere il problema. Pensavo che un aggiornamento causasse un postback. – Jason

0

La memorizzazione dei valori in un campo nascosto non è più un ostacolo di quanto lo sia .NET Web Form. Gran parte dei dati dell'applicazione vengono passati/archiviati nel campo __VIEWSTATE nascosto.

Detto questo, potresti chiarire cosa sta succedendo? Stai impostando il valore sul caricamento della pagina o in reazione a qualche azione dell'utente? Potresti fornire parte del tuo codice in modo da poter avere un'immagine più chiara di ciò che stai facendo?

EDIT

Si sta impostando in modo esplicito il valore di una delle casella di testo o l'etichetta nel vostro caricamento della pagina/postback codebehind? Ciò sostituisce qualsiasi valore impostato dallo script client. Non riesco a pensare ad alcun altro motivo per cui i valori non persisterebbero. Se sei davvero disperato, puoi inviare le informazioni al server tramite una chiamata AJAX alla fine della tua funzione javascript, in modo da averla nella memoria del server da qualche parte.

0

quando si imposta il valore? È possibile impostare il valore del carico della pagina in javascript purché si utilizzi il clientId della casella di testo.

1

L'unico problema è che quando ho rinfresco pagina, il testo nel CharacterNameTextBox e ClassNameLabel, che erano set lato client tramite javascript, si perdono.

Dal momento che si sta impostando il valore sul lato client Io suggerirei di usare i cookie per memorizzare i dati e il controllo per il cookie nel vostro lato client, in quanto ViewState non aiuterà qui se state per impostare il client-valore lato indipendentemente da ciò che CodeBehind avrebbe impostato.

0

Il problema potrebbe essere una delle due cose. L'aggiornamento potrebbe cancellare quindi il campo.Inoltre, se stai postando, imposti il ​​valore della casella di testo sull'evento di caricamento (o scarico) della pagina?

2

In caso pagina PreInit, prova ad accedere il valore in questo modo:

Richiedi [ "CharacterNameTextBox"]

stavo correndo lo stesso problema (un valore impostato tramite JavaScript non sarebbe mai post indietro, ma un valore digitato) e un collaboratore lo ha suggerito. Dead on, funziona come un fascino.

-1

Devi ricordarti, BACIO.

Basti pensare dei campi esistenti come di presentazione in natura e aggiungere campi di input nascosti con un attributo runat = "server" e impostare quelli con JavaScript nel tuo stesso evento lato client.

Quelli sono i tuoi veri valori che si desidera nel code-behind metodi e sarete in grado di afferrare quelle nessun problema. Dal momento che l'oggetto textbox è un'astrazione .NET, suggerirei di eseguire il lavoro lato client utilizzando gli input HTML eseguiti sul server. Sembra salvarmi un mal di testa quando sono al ginocchio nelle forme web BS.

Penso che ci siano un sacco di soluzioni qui, ma io sono tutto per la rottura del polso e si allontana, se posso.

6

Penso che se la casella di testo non è modificabile: Enabled = False o ReadOnly = false.
Asp.net "per motivi di sicurezza" prende il valore da questa casella di testo dal suo ViewState.
Ecco perché quando si utilizza qualcosa come un campo nascosto o ingresso, è possibile ottenere il valore.

0

Un'altra soluzione è di sessione, è possibile assegnare una sessione nel primo carico o dalla pagina esterna, quindi verificare se la sessione non è nullo, il valore quindi impostare a casella di testo. Ecco ad esempio: nella pagina esterna:

if (id == "txtDD") 
     { 
      Session["DD"] = calendar.SelectedDate.ToShortDateString(); 
     } 
and in code behind check it: 

protected void Page_Load(object sender, EventArgs e) 
    { 
    if(Session["DD"]!= null) 
     txtDD.Text =Session["DD"].ToString(); 
    } 
0

Invece di fare una casella di testo in sola lettura si può provare questo

onKeyPress = "javascript: return false;" onPaste = "javascript: return false;" 

non perderà il suo valore.

Problemi correlati