2010-08-18 6 views
6

मेरे पास एक एएसपी.नेट पृष्ठ है जिसमें दो div हैं। दोनों में खोज फ़ील्ड और उनमें से प्रत्येक के भीतर एक खोज बटन है। जब मैं पहली बार इस पृष्ठ पर आ जाता हूं, तो Div A में 'सर्चडिव' श्रेणी होती है जबकि Div B में 'SearchDivDisabled' है। ये वर्ग उपस्थिति को बदलते हैं ताकि उपयोगकर्ता जानता है कि वर्तमान में वे किस खोज प्रकार को सक्षम कर चुके हैं।'बैक' बटन का उपयोग होने पर डिव क्लास जारी नहीं है

जब डिव बी क्लिक किया जाता है, तो जावास्क्रिप्ट इसकी कक्षा को 'सर्चडिव' में बदलता है, और Div A को 'SearchDivDisabled' में बदल देता है। यह सब एक आकर्षण की तरह काम करता है। मेरी समस्या यह है कि जब कोई उपयोगकर्ता Div B में बदलता है, तो Div B के खोज बटन पर क्लिक करता है (जो स्पष्ट रूप से परिणाम पृष्ठ पर रीडायरेक्ट करता है), और उसके बाद ब्राउज़र के बैक बटन का उपयोग करता है। जब वे खोज पृष्ठ पर वापस आते हैं, तो Div A को फिर से सक्षम किया जाता है, और डिव बी अक्षम है, भले ही वे अंतिम रूप से Div B. का उपयोग करते हैं। खोज बटन ईवेंट हैंडलर में मैंने रीडायरेक्ट करने से पहले divs की क्लास विशेषता सेट की है, उम्मीद है कि यह अपडेट होगा सर्वर पर पृष्ठ, जब उपयोगकर्ता लौटाता है, तो उनका अंतिम-सक्षम Div अभी भी सक्षम हो जाएगा (इस पर ध्यान दिए बिना कि पृष्ठ को पहली बार किस बार देखा गया था)।

मेरा मानना ​​है कि इसमें व्यूस्टेट शामिल है, लेकिन मुझे यकीन नहीं है कि कक्षा विशेषता क्यों सहेजी नहीं जाती है, जब उपयोगकर्ता पृष्ठ पर वापस आ जाता है तो इसे पुनर्स्थापित किया जाता है। क्या मैं यहां कुछ खो रहा हूं, या जिस व्यवहार को मैं चाहता हूं उसकी गारंटी देने का कुछ आसान तरीका है? धन्यवाद!

संपादित करें:

protected void RedirectToResults(int searchEnum, string resultPage) 
{ 
    ShowContainer(searchEnum); 
    Response.Redirect(resultPage + this.webParams.getAllVariablesString(null)); 
} 

    protected void ShowContainer(int searchContainerToShow) 
    { 
    if (searchContainerToShow < 0 || searchContainerToShow > SearchContainers.Count || SearchContainers.Count == 0) 
     return; 

    //disable all search panels 
    foreach (SearchContainer container in SearchContainers.Values) 
    { 
     container.searchDiv.Attributes.Add("class", "SearchDivDisabled"); 
    } 

    //enable selected panel 
    SearchContainers[searchContainerToShow].searchDiv.Attributes.Add("class", "SearchDiv"); 
    } 

RedirectToResults() enum चयनित खोज पैनल और परिणाम पृष्ठ यूआरएल का प्रतिनिधित्व करने के साथ वास्तविक बटन ईवेंट हैंडलर से कहा जाता है: यहाँ बटन ईवेंट हैंडलर कोड है। SearchContainers खोज div के लिए एक पूर्णांक मैपिंग एक शब्दकोश है। महत्वपूर्ण कोड अंतिम पंक्ति है, जहां मैं चयनित खोज कंटेनर को 'सक्रिय' खोज वर्ग के साथ अक्षम कर रहा हूं, जिसे अक्षम (जिसे मैं अन्य div (ओं) को असाइन करता हूं)

अतिरिक्त अद्यतन: मैं पिछले कुछ दिनों से इस मुद्दे से जूझ रहा हूं। मैं इन सबसे छुटकारा (Page_Load में) काम करने के लिए निम्नलिखित कोड प्राप्त करने में सक्षम था:

 Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
     Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0. 
     Response.AppendHeader("Expires", "0"); // Proxies. 

लेकिन यह वास्तव में सब कुछ के रूप में एक समाधान है, सही ढंग से कैश की गई हो जाता है कि खो दिया है, जो मुझे भी बदतर बंद जब से छोड़ देता है नहीं है मैंने शुरू किया। बाकी सब कुछ ठीक रहता है, यह केवल div की कक्षा है जो मुझे संघर्ष कर रही है।

संपादित करें: बस इसे किसी और के लिए अपडेट करना चाहता था जो इस पर आता है। जबकि मेरा मानना ​​है कि ब्राउज़र की पोस्टबैक को मजबूर करने के लिए पेज की कैशबिलिटी सेट करने के साथ यहां एक समाधान है, मैं इसे सभी ब्राउज़रों के साथ 100% काम नहीं कर सका (मुख्य रूप से फ़ायरफ़ॉक्स मुझे फिट कर रहा था, जो एक दस्तावेज बग है)। मेरा मानना ​​है कि कुकी समाधान काम करेगा, लेकिन मुझे लगा कि यह कुछ div की स्थिति को स्टोर करने की कोशिश करने के लिए आवश्यक से थोड़ा अधिक जटिल हो सकता है।

मैं जो कर रहा हूं वह div की कक्षा को इसके संबंधित रेडियो बटन की स्थिति में बांध रहा था (वहां div के बगल में रेडियो बटन हैं जो उपयोगकर्ताओं को खोज पैनलों को सक्षम करने का एक और दृश्य तरीका प्रदान करते हैं)। मैंने देखा कि बैक बटन का उपयोग होने पर इन रेडियो बटनों ने सही चेक किए गए मान को बरकरार रखा था, इसलिए मैं गारंटी दे सकता था कि वे सही div को सक्षम करने के लिए इंगित करेंगे। तो जावास्क्रिप्ट के अधिभार में मैं जांचता हूं कि कौन सा रेडियो बटन सक्षम है, और उसके बाद खोज div के वर्गों को तदनुसार समायोजित करें। यह एक बहुत बड़ा हैक है, लेकिन सभी ब्राउज़रों में 100% काम किया है, और केवल जावास्क्रिप्ट की लगभग 10 लाइनें ली हैं।

उत्तर

4

क्योंकि आप div की शैली को बदलने के लिए वापस पोस्ट नहीं कर रहे हैं, जब उपयोगकर्ता बैक बटन हिट करता है तो यह पृष्ठ को मूल रूप से पोस्ट करने के तरीके पर वापस ले जाता है। इसे ठीक करने का आसान तरीका यह है कि बटन एक पोस्टबैक का कारण बनता है जो शैली को टॉगल करता है।

+0

जैसा कि मैंने उपरोक्त उल्लेख किया है, 'खोज बटन ईवेंट हैंडलर में मैंने रीडायरेक्ट करने से पहले divs की क्लास विशेषता सेट की है, उम्मीद है कि यह सर्वर पर पेज अपडेट करेगा, इसलिए जब उपयोगकर्ता वापस आएगा, तो उनका अंतिम-सक्षम Div अभी भी होगा सक्षम 'तो मैं यह कर रहा हूँ।मैं मूल पोस्ट को कोड के साथ अपडेट कर दूंगा। – Kevin

1

मुझे नहीं लगता कि व्यूस्टेट यहां समस्या है; यह ऐसा कुछ हो सकता है जिसे क्लाइंट-साइड जावास्क्रिप्ट कोड में प्रबंधित करने की आवश्यकता हो, क्योंकि क्लाइंट पर स्विचिंग स्टेटस सर्वर पर स्वचालित रूप से दिखाई नहीं दे रहा है ...

इतिहास बिंदुओं के माध्यम से ब्राउज़र इतिहास के प्रबंधन की सुविधा क्या आप संभावित देखना चाहते है: http://msdn.microsoft.com/en-us/library/cc488548.aspx

HTH।

0

आप खोज बटन में रीडायरेक्ट करने से पहले एक खोज संस्करण में 'खोजडिव' कक्षा में सेट किए गए div की आईडी को स्टोर कर सकते हैं, खोज पृष्ठ के अधिभार के दौरान div प्राप्त करें और उस पर उचित कक्षा निर्धारित करें।
इस तरह से आप अनावश्यक पोस्ट divs पर कक्षाएं चालू करने के लिए अपने जावास्क्रिप्ट का उपयोग करें और केवल एक भिन्न पृष्ठ पर रीडायरेक्ट से पहले डेटा बचाने के लिए और से बचने के लिए जारी रख सकता

+0

इसके साथ समस्या यह है कि बैक बटन का उपयोग होने पर ऑनलोड() आग नहीं होती है। तो सत्र में संग्रहीत होने के बावजूद, जब भी उपयोगकर्ता खोज पृष्ठ पर वापस जाता है तो मैं कुछ भी नहीं बदल सकता क्योंकि यह सभी क्लाइंट पक्ष है। – Kevin

+0

खोज पृष्ठ में केविन, ऑनलोड() को निकाल दिया नहीं जा रहा है क्योंकि पेज कैश से प्राप्त किया गया है। Response.Cache.SetCacheability जोड़ें (HttpCacheability.NoCache); अपने खोज पेज के पेज_ लोड फ़ंक्शन में देखें और देखें कि ईवेंट को निकाल दिया गया है या नहीं जब आप –

1

मेरे पिछले जवाब में उल्लेख किया है कि तुम सब है कि आप का उपयोग कर की जरूरत प्राप्त कर सकते हैं सत्र चर चूंकि आपने डीआईवी चयन को जारी रखने के बारे में उल्लेख किया था, इसलिए मैंने आपको सत्र चर में यह करने के लिए कहा था। आप चाहते हैं अन्य रूप डेटा के रूप में अच्छी तरह से कायम किया जाना है उन सब को सत्र चर (सुनिश्चित करें कि आप उन्हें साफ के रूप में बनाने के लिए और जब आप उन लोगों के साथ किया जाता है) में डंप हैं

यह तुमसे मिलने के लिए सबसे आसान तरीका क्या होगा आपके आवश्यकता।

इसके अलावा, आप उपयोग कर रहे हैं

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
    Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0. 
    Response.AppendHeader("Expires", "0"); // Proxies. 

आप अपने Page_Load में सरल उपयोग

Response.Cache.SetCacheability(HttpCacheability.Private); 

कर सकते हैं और एक ही कार्यक्षमता

मुझे पता है अगर आप इस को लागू करने के लिए किसी भी sppecific चिंता है चलो प्राप्त।

+0

पर क्लिक करते हैं, बस इस पर एक टिप्पणी जोड़ना चाहते थे। फ़ायरफ़ॉक्स इस में एक समस्या है, क्योंकि यह मूल रूप से किसी पृष्ठ पर 'कैशेबिलिटी' ध्वज को अनदेखा करता है और जो चाहे वह कैश करेगा। आईई में यह काम करता है, लेकिन यदि आप क्रॉस ब्राउज़र का समर्थन करना चाहते हैं तो मुझे पृष्ठ पर नेविगेट करने के लिए 'बैक' का उपयोग करते समय एफएफ को पोस्टबैक करने के लिए मजबूर करने का एक अच्छा तरीका नहीं मिला है। – Kevin

3

ग्राहक पक्ष पर कुकी में सेटिंग स्टोर करें, फिर पेज के लोड पर जावास्क्रिप्ट के माध्यम से कुकी को चेक करें और सीएसएस क्लास को बदलें। इसे ठीक करने के अन्य तरीके काम नहीं कर सकते हैं क्योंकि जब उपयोगकर्ता Back बटन हिट करता है तो पृष्ठ हमेशा सर्वर से अनुरोध नहीं किया जाता है।

jQuery cookie plugin

// this function will update the style of the divs based on the cookie's settings 
function updateClass(){ 
    var val = $.cookie('myCookieName'); 

    // set your div's class 
    if (!val || val=='divA') 
    { 
     $('#divA').removeClass('SearchDivDisabled'); 
     $('#divA').addClass('SearchDiv'); 
     $('#divB').removeClass('SearchDiv'); 
     $('#divB').addClass('SearchDivDisabled'); 
    }else{ 
     $('#divB').removeClass('SearchDivDisabled'); 
     $('#divB').addClass('SearchDiv'); 
     $('#divA').removeClass('SearchDiv'); 
     $('#divA').addClass('SearchDivDisabled'); 
    } 
} 

// call this passing in 'divA' or 'divB' depending on which is selected 
function updatePage(selectedDiv){ 
    $.cookie('myCookieName', selectedDiv, { path: '/', expires: 10 }); 
    updateClass(); 
} 

// change the class of the divs when the page is finished rendering 
$(document).ready(function(){updateClass();}): 
1

का उपयोग कर यह एक दो तरह से संबोधित किया जा सकता।

यदि प्रत्येक खोज फ़ॉर्म किसी भिन्न यूआरएल पर पोस्ट करता है, तो प्रत्येक यूआरएल को सत्र चर सेट करना चाहिए, जिसे 'LastSearchMethd' कहा जाता है, उदाहरण के लिए, 'ए' या 'बी' के लिए। यदि वे दोनों एक ही यूआरएल पर पोस्ट करते हैं, तो बस एक छिपे हुए फ़ील्ड को शामिल करें जिसमें क्रमशः प्रत्येक फॉर्म के लिए 'ए' या 'बी' शामिल है, और सत्र चर में सबमिट किए गए मान को सहेजें।

किसी भी तरह से, आपको सत्र चर के मान के आधार पर प्रत्येक डीवीवी की शैली प्रस्तुत करने की आवश्यकता होती है।

जैसा कि अन्य पोस्टर द्वारा उल्लिखित है, कैशिंग सही प्राप्त करना भी एक विचार होगा।

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