2009-05-04 13 views
5

के बाद डेटाबेस() पर पूरी तरह अद्यतन नहीं है। मेरे पास एक सूची दृश्य नियंत्रण है जो एक अजीब व्यवहार का प्रदर्शन कर रहा है - पंक्तियां केवल पोस्टबैक के बाद आंशिक रूप से अपडेट हो रही हैं। मुझे उम्मीद है कि यहां कोई व्यक्ति कुछ प्रकाश डाल सकता है कि यह क्यों हो रहा है।पोस्टबैक

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

समस्या यह है कि कुछ सूचीदृश्य में तत्वों की नए आदेश के अनुसार मूल्य में परिवर्तन नहीं करते है। जबकि पृष्ठ पर संसाधित हाइपरलिंक्स और टेक्स्ट (यानी <% # Eval ("ProjectAbbrev")%>) उचित रूप से अपडेट किए जाते हैं, चेकबॉक्स, अक्षर, और ड्रॉपडाउन जिनके मूल्य OnItemDataBound ईवेंट विधि के माध्यम से सेट होते हैं - वे रहते हैं जगह में "जमे हुए", भले ही कोड के माध्यम से कदम उठाने से पता चलता है कि विधि पोस्टबैक के दौरान चलती है, और नियंत्रण को अपने नए मूल्यों पर सेट किया जाना चाहिए। यदि मैं जाता हूं और कहने के लिए मैन्युअल रूप से छंटनी करता हूं, आधा मूल आकार, सुनिश्चित करें कि केवल उन वस्तुओं को दोहराया गया है, लेकिन चेकबॉक्स और ऐसे अभी भी उनके मूल मान बनाए रखते हैं।

तो मेरा सवाल है: इन तत्वों को पोस्टबैक पर बाकी सूचीदृश्य नियंत्रण तत्वों के साथ क्यों अपडेट नहीं किया जा रहा है? मुझे एहसास है कि मैं एएसपी.नेट में पेज लाइफसाइक्ल को गलत समझ रहा हूं या मुझे किसी तरह का बग मिला है।

इस बिंदु पर मुझे लगता है कि मुझे जावास्क्रिप्ट में पृष्ठ पर अधिक जटिल सॉर्टिंग ऑपरेशन को स्थानांतरित करना होगा, लेकिन यह मुश्किल होगा और यदि संभव हो तो मैं ऐसा करने से बचना चाहूंगा।


अपडेट: मैंने EnableViewState को गलत पर सेट करने का प्रयास किया है और यह इसे ठीक नहीं करता है। मैं किसी भी मामले में उस रणनीति का उपयोग नहीं कर सका क्योंकि पेज के अन्य हिस्सों (सेव) अंत में व्यूस्टेट पढ़ने पर भरोसा करते हैं।
अद्यतन: मैं इस उम्मीद में कुछ कोड के टुकड़े प्रदान कर रहा हूँ कि वे इस मुद्दे पर कुछ प्रकाश डाला सकता है:

पृष्ठ: हाइपरलिंक तत्व पोस्टबैक के बाद ठीक से अपडेट करेगा, लेकिन चेक बॉक्स जो अपने मूल्य है में सौंपा OnQueueRepeater_ItemDataBound विधि, वही रहेगी।

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %> 

<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound"> 
<ItemTemplate> 
    <tr> 
    <td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td> 
    <td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td> 
    </tr> 
</ItemTemplate> 
</asp:ListView> 

कोड के पीछे: पोस्टबैक पर, निम्नलिखित कोड निष्पादित करता है:

protected List<Book> QueueDataItems 
{ 
get { return (List<Book>)Session["Queue"]; } 
set { Session["Queue"] = value; } 
} 

else if (IsPostBack && !Page.IsCallback) 
{ 
// resort QueueDataItems List appropriately 
ResortQueue(Request.Params) 
// rebind 
QueueListView.DataSource = QueueDataItems; 
QueueListView.DataBind(); 
} 

protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
// ... 
// ... other controls set 
CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox; 
scannedCheckBox.Checked = book.Scanned; 
} 

अद्यतन: मैं काम करने के लिए इस प्राप्त करने पर छोड़ दिया और जावास्क्रिप्ट के साथ ग्राहक के पक्ष के लिए मेरे छँटाई तर्क स्थानांतरित किया है। अगर किसी के पास कोई विचार है कि यह अजीब व्यवहार क्यों हो रहा था, तो भी मुझे उनकी सुनवाई में बहुत दिलचस्पी होगी!

उत्तर

6

ब्याज से बाहर, पृष्ठ पर आप किस बिंदु पर डाटाबेसिंग कर रहे हैं? Page_Load?

ऑनप्रेंडर पर इसे आज़माएं - मदद कर सकता है।

+0

धन्यवाद समय! मैंने इस पर बहुत अधिक कदम उठाया है, लेकिन अगर मैं इस मुद्दे को फिर से चलाता हूं, तो मैं उसे एक शॉट देना सुनिश्चित कर दूंगा। – patjbs

+0

टिम सही है - मुझे एक ही समस्या थी और पेजब्रेरेंडर पोस्टबैक पर काम करता है :) – Jason

1

लगता है कि व्यूस्टेट डेटा को लात मार रहा है और डेटा को दोबारा बदल रहा है। किसी भी मामले में, यदि आप किसी भी पोस्टबैक में डाटाबेसिंग कर रहे हैं, तो संभवतः आपको पृष्ठ सूची को कम करने के लिए अपनी सूची दृश्य के EnableViewState को झूठी पर सेट करना चाहिए।

+0

व्यूस्टेट को अक्षम करने से दुर्भाग्यवश समस्या हल नहीं होती है। – patjbs

0

शायद आपकी QueueListView किसी कारण से पुनः बाध्य हो रहा है।

DataBind() के बाद डेटास्रोत मूल्य रीसेट करने को देखने के लिए क्या

QueueListView.DataBind(); 
QueueListView.DataSource = null; 
+0

विचार के लिए धन्यवाद लेकिन दुर्भाग्य से कोई भाग्य नहीं – patjbs

0

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

मैं केवल इसका उल्लेख करता हूं क्योंकि जो त्रुटि मैं आपके जैसा महसूस कर रहा था। मैं नहीं देख सकता कि आप आइटम डेटाबेस में पुस्तक को कैसे पुनर्प्राप्त कर रहे हैं - और आप चीजों के दिखने से एक्सएमएल डेटासोर्स का उपयोग नहीं कर रहे हैं ..... लेकिन मैंने सोचा कि टिप्पणी आपके लिए कुछ ट्रिगर कर सकती है। शुभकामनाएँ .... हालांकि ऐसा लगता है कि आप पहले से ही आगे बढ़ चुके हैं :-)।

0

क्या चेकबॉक्स नियंत्रण ReadOnly = true या सक्षम = झूठा है?

मुझे उपरोक्त के रूप में सेट किए गए इन गुणों में से किसी एक के साथ नियंत्रण में समस्या है, इससे कोई फर्क नहीं पड़ता कि मैं कोड के नियंत्रण में नियंत्रण को कैसे नियंत्रित करता हूं। मुझे लगता है कि व्यूस्टेट को अक्षम करने से एएसपी.नेट की उस छोटी "फीचर" को भी बाईपास किया जाएगा, लेकिन यह एक शॉट के लायक है।

इसके अलावा, यदि आइटम क्लाइंटसाइड कोड के माध्यम से सॉर्ट किए जाते हैं, तो वह पोस्टबैक पर संरक्षित ऑर्डरिंग है? मुझे नहीं लगता कि आप जावास्क्रिप्ट के माध्यम से सत्र में सीएलआर ऑब्जेक्ट को बदल सकते हैं।

+0

केवल पढ़ने के लिए सेट नहीं है, और समस्या उन उपयोगकर्ताओं के लिए होती है जिनके लिए चेकबॉक्स सक्षम हैं, और जिनके लिए वे नहीं हैं। दिलचस्प विचार हालांकि मैं देख सकता हूं। क्लाइंट साइड सॉर्टिंग के लिए, एक रिसॉर्ट करने से कॉलबैक फ़ंक्शन बंद हो जाता है जो सर्वर सत्र डेटा को क्लाइंट को देखकर अद्यतित रखता है। – patjbs

0

यह सुनिश्चित नहीं करता है कि यह मदद करता है, <% # Eval ("ProjectAbbrev")%> को हाइपरलिंक के साथ बदलें। अगला ऑनक्यूयू रेपेटर_इटेमडेटाबाउंड विधि में असाइन किया गया है और देखें कि सभी पंक्तियां सही तरीके से आबादी में आती हैं या नहीं।

यह शायद आपकी समस्या का समाधान नहीं करेगा, लेकिन परिणाम जानने के लिए दिलचस्प होगा।

+0

वह फ़ील्ड वास्तव में ऊपर दिखाए गए कोड में सही ढंग से प्रस्तुत कर रहा था। यह चेकबॉक्स और ड्रॉपडाउन (दिखाया नहीं गया था) जो शेष प्रदर्शन के साथ उचित रूप से रिसॉर्ट/रीड्रो करने में असफल रहा। – patjbs

+0

हाँ मुझे तुम्हारा मतलब क्या मिला। बीटीडब्ल्यू, आपके कोड में कोई ड्रॉपडाउन नहीं देखा, डाटाबेसिंग कैसे किया गया था? नियंत्रण के बिना चेकबॉक्स और ड्रॉपडाउन के लिए केवल टेक्स्ट/लेबल प्रस्तुत करने का प्रयास करें। देखें कि मान प्रदान किए जाते हैं या नहीं। –

2

मुझे लगता है कि यह पृष्ठ जीवन चक्र के दौरान विभिन्न घटनाओं को ट्रिगर करने के क्रम से संबंधित है। ASP.NET Page Life Cycle Overview देखें। आपको पेज_ऑनप्रेंडर में डाटाबेसिंग करना चाहिए ताकि यह सुनिश्चित किया जा सके कि पृष्ठ पर नियंत्रण ईवेंट (जो डाटा अपडेटिंग का कारण बनता है) के बाद प्रतिलिपि बनाई जाती है।

+0

यह।एफएफएस, निश्चित रूप से जब आप डेटाबैंड को फिर से कॉल करते हैं, तो इसे कंट्रोलस्टेट को अमान्य करना चाहिए? –