2009-05-28 12 views
5

के माध्यम से मैं जावास्क्रिप्ट क्लाइंट-साइड के माध्यम से टेक्स्टबॉक्स का मान सेट कर रहा हूं। जब मैं पृष्ठ को रीफ्रेश करता हूं तो मान खो जाता है।एएसपी.NET टेक्स्टबॉक्स पोस्टबैक के बाद मूल्य खो रहा है जब मूल्य बदल जाता है क्लाइंट-साइड जावास्क्रिप्ट

टेक्स्टबॉक्स अक्षम नहीं है या केवल पढ़ने के लिए सेट है।

मैंने मूल्य को छिपे हुए क्षेत्र में रखने के लिए सुझाव पढ़े हैं, मैं ऐसा नहीं करना चाहूंगा। यह एक हैक की तरह लगता है।

पाठ बॉक्स जैसे जब कोई उपयोगकर्ता नियंत्रण में है:

<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> 

यह नियंत्रण .aspx पृष्ठ पर है।

उपयोगकर्ता पाठ बॉक्स डबल क्लिक करता है, प्रेस जबकि पाठ बॉक्स ध्यान केंद्रित किया, या पाठ में परिवर्तन दर्ज करें, निम्न JavaScript समारोह कहा जाता है:

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); 
    } 
} 

एक बार वेब सेवा कॉल पूरा, है निम्नलिखित जावास्क्रिप्ट समारोह कहा जाता है:

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; 
} 

केवल समस्या यह है कि जब मैं पृष्ठ को रीफ्रेश, CharacterNameTextBox और ClassNameLabel में पाठ है, जो जावास्क्रिप्ट के माध्यम से क्लाइंट साइड स्थापित किए गए थे, खो रहे हैं।

मैं कैसे सुनिश्चित कर सकता हूं कि नियंत्रण पोस्टबैक के बीच अपना मूल्य बनाए रखे?

+1

क्या यह या <इनपुट प्रकार = "टेक्स्ट"> है? क्या आपके पास runat = "server" विशेषता है? –

उत्तर

8

पेज (F5 दबा) रिफ्रेशिंग एक पोस्टबैक से अलग है। मुझे विश्वास नहीं है कि आपके टेक्स्ट बॉक्स में मान को रीफ्रेश पर सर्वर पर वापस पोस्ट किया जा रहा है। पाठ बॉक्स में मान वापस पोस्टबैक पर सर्वर पर पोस्ट किया जाएगा (जब तक टेक्स्टबॉक्स की केवल पढ़ने योग्य विशेषता सत्य पर सेट नहीं है, लेकिन यह एक अलग कहानी है)।

+0

यह मुद्दा बन गया। मैंने सोचा कि एक ताज़ा करने के कारण एक वापसी हुई। – Jason

0

किसी छिपे हुए फ़ील्ड में मान संग्रहीत करना .NET वेब फ़ॉर्म की तुलना में हैक का अधिक नहीं है। अधिकांश एप्लिकेशन डेटा छिपा हुआ __VIEWSTATE फ़ील्ड में पास/संग्रहीत किया जाता है।

कहा जा रहा है, क्या आप यह स्पष्ट कर सकते हैं कि क्या हो रहा है? क्या आप पृष्ठ लोड पर मूल्य निर्धारित कर रहे हैं, या कुछ उपयोगकर्ता कार्रवाई के जवाब में? क्या आप अपना कुछ कोड प्रदान कर सकते हैं ताकि हम आपके द्वारा किए जा रहे कार्यों की एक स्पष्ट तस्वीर प्राप्त कर सकें?

संपादित

आप स्पष्ट रूप से अपने पेज लोड/पोस्टबैक codebehind में पाठ बॉक्स या लेबल में से किसी का मान सेट कर रहे हैं? यह क्लाइंट स्क्रिप्ट द्वारा निर्धारित किसी भी मान को ओवरराइड करेगा। मैं किसी अन्य कारण के बारे में नहीं सोच सकता कि मूल्य क्यों नहीं बनेगा। यदि आप वास्तव में हताश हैं, तो आप अपने जावास्क्रिप्ट फ़ंक्शन के अंत में जानकारी को AJAX कॉल के माध्यम से सर्वर पर वापस भेज सकते हैं, ताकि आपके पास सर्वर मेमोरी में कहीं भी हो।

0

जब आप मूल्य निर्धारित करते हैं? जब तक आप टेक्स्टबॉक्स के क्लाइंट आईडी का उपयोग कर रहे हों तब तक आप जावास्क्रिप्ट में पेज के मान ऑनलोड को सेट कर सकते हैं।

1

केवल समस्या यह है कि जब मैं ताज़ा पेज, CharacterNameTextBox और ClassNameLabel में पाठ है, जो जावास्क्रिप्ट के माध्यम से थे सेट क्लाइंट साइड, खो रहे हैं।

जब से तुम मूल्य क्लाइंट साइड मुझे लगता है कि डाटा स्टोर करने के लिए कुकीज़ का उपयोग करते हुए सुझाव है कि स्थापित करने और अपने क्लाइंट साइड में है कि कुकी के लिए जाँच के बाद से ViewState यहाँ मदद नहीं करेगा अगर आप सिर्फ मूल्य ग्राहक की स्थापना कर रहे हैं कर रहे हैं चाहे कोडबाइंड इसे किस सेट करेगा, इस पर ध्यान दिए बिना।

0

समस्या दो चीजों में से एक हो सकती है। रीफ्रेश फ़ील्ड को साफ़ कर सकता है।साथ ही, यदि आप वापस पोस्ट कर रहे हैं, तो क्या आप पेज लोड (या अनलोड) ईवेंट पर टेक्स्ट बॉक्स का मान सेट करते हैं?

2

पेज preinit घटना में, इस तरह मूल्य एक्सेस करके देखें:

अनुरोध [ "CharacterNameTextBox"]

मैं एक ही मुद्दे में जावास्क्रिप्ट के माध्यम से सेट वापस पोस्ट कभी नहीं होगा एक मूल्य के चल रहा था (है, लेकिन एक टाइप किया गया मूल्य होगा) और एक सहकर्मी ने इसका सुझाव दिया। पर एक आकर्षण की तरह काम करता है।

-1

आप याद करने के लिए, KISS है।

बस प्रकृति में प्रस्तुतिकरण के रूप में अपने मौजूदा क्षेत्रों के बारे में सोच और एक runat = "सर्वर" विशेषता के साथ छिपे हुए इनपुट क्षेत्रों को जोड़ने और अपनी ही क्लाइंट साइड घटना में जावास्क्रिप्ट के साथ उन लोगों की स्थापना की।

उन अपने वास्तविक मूल्यों आप अपने कोड-पीछे तरीकों में चाहते हैं और आप उन कोई समस्या नहीं हड़पने के लिए सक्षम हो जाएगा। चूंकि टेक्स्टबॉक्स ऑब्जेक्ट एक .NET अबास्ट्रक्शन है, इसलिए मैं सर्वर पर चलने वाले HTML इनपुट का उपयोग करके क्लाइंट-साइड काम को सहेजने का सुझाव दूंगा। ऐसा लगता है कि जब मैं वेब फॉर्म बीएस में घुटने-गहरे हूं तो मुझे सिरदर्द बचाता है।

मुझे लगता है कि यहाँ के समाधान का एक बहुत हैं, लेकिन मैं कलाई तोड़ने और अगर मैं यह कर सकते हैं दूर चलने के लिए सभी हूँ।

6

मुझे लगता है कि यदि पाठ बॉक्स संपादन योग्य नहीं है: सक्षम = झूठी हो या केवल पढ़ने = false।
Asp.net "सुरक्षा पुनर्विक्रय के लिए" इस टेक्स्टबॉक्स से अपने व्यूस्टेट से मूल्य लेता है।
यही कारण है कि जब आप किसी छिपे हुए फ़ील्ड या इनपुट की तरह उपयोग करते हैं, तो आप मान प्राप्त कर सकते हैं।

0

एक और समाधान सत्र है, आप पहले लोड में या बाहरी पृष्ठ से एक सत्र असाइन कर सकते हैं, फिर जांचें कि सत्र शून्य नहीं है, फिर टेक्स्ट बॉक्स पर मान सेट करें। यहाँ उदाहरण है: बाहरी पृष्ठ में :

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

इसके बजाय एक पाठ बॉक्स बनाने का केवल पढ़ने के लिए आप इस

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

यह अपने मूल्य ढीला नहीं होगा कोशिश कर सकते हैं।

संबंधित मुद्दे