2012-08-28 13 views
6

एक WebControl में, मैं एक संपत्ति है Filters इस तरह परिभाषित किया गया:क्या व्यूस्टेट में अज्ञात प्रतिनिधि को स्टोर करने का कोई तरीका है?

public Dictionary<string, Func<T, bool>> Filters 
{ 
    get 
    { 
     Dictionary<string, Func<T, bool>> filters = 
       (Dictionary<string, Func<T, bool>>)ViewState["filters"]; 
     if (filters == null) 
     { 
      filters = new Dictionary<string, Func<T, bool>>(); 
      ViewState["filters"] = filters; 
     } 
     return filters; 
    } 
} 

यह Webcontrol एक DataSource, मैं इस संपत्ति बनाई क्योंकि मैं आसानी से डेटा को फ़िल्टर करने possiblity, जैसे करना चाहते है:

//in page load  
DataSource.Filters.Add("userid", u => u.UserID == 8); 

यह बहुत अच्छा काम करता है, फिर भी, अगर मैं इस के लिए कोड बदलने के लिए:

//in page load  
int userId = int.Parse(DdlUsers.SelectedValue); 
DataSource.Filters.Add("userid", u => u.UserID == userId); 

यह wor नहीं है

प्रकार System.Web.UI.Page विधानसभा में serializable रूप में चिह्नित नहीं किया गया है '...': ks अब, मैं इस त्रुटि मिलती है।

क्या हुआ:

  1. serializer शब्दकोश का निरीक्षण किया। यह देखता है के बाद से प्रतिनिधि एक कक्षा में परिभाषित किया गया है यह एक गुमनाम प्रतिनिधि (यहाँ लैम्ब्डा)
  2. सम्मिलित हैं, तो, पूरी कक्षा को क्रमानुसार करने की कोशिश करता है इस मामले System.Web.UI.Page
  3. इस वर्ग के रूप में चिह्नित नहीं है serializable
  4. यह 3.

की वजह से एक अपवाद फेंकता है इस को हल करने के लिए किसी भी सुविधाजनक समाधान है? मैं उन सभी वेब पृष्ठों को चिह्नित नहीं कर सकता जहां मैं डेटा स्रोत को [serializable] के रूप में स्पष्ट कारणों से उपयोग करता हूं।


संपादित करें 1: कुछ मुझे समझ नहीं आता। अगर मैं Session ऑब्जेक्ट में संग्रहीत करता हूं (BinaryFormatter बनाम LosFormatterViewState के लिए 0), यह काम करता है! मुझे नहीं पता कि यह कैसे संभव है। शायद BinaryFormatter किसी भी वर्ग को क्रमबद्ध कर सकता है, यहां तक ​​कि वे [serializable] नहीं हैं?


संपादित 2:

void test() 
{ 
    Test test = new Test(); 
    string param1 = "parametertopass"; 
    test.MyEvent +=() => Console.WriteLine(param1); 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.Serialize(ms, test); //bang 
    } 
} 

[Serializable] 
public class Test 
{ 
    public event Action MyEvent; 
} 
+0

"यह काम करता है मुझे पता नहीं कैसे ... है!": सत्र डेटा रहता है सर्वर साइड, में स्मृति। जब आप 2+ सर्वर पर जाते हैं तो यह तोड़ना शुरू हो जाएगा। जानकारी –

+0

THX। मुझे यकीन नहीं है कि दूसरा प्रस्ताव कैसे काम करेगा। फ़िल्टरसेटिंग क्लास के उदाहरण को तुरंत चालू और पकड़ेंगे कौन? अपने पेज है, वहाँ किसी भी जोखिम है कि serializer रूप में अच्छी तरह पेज तक पहुंच जाएगा नहीं है? क्या आप इस समाधान का उपयोग कैसे करें के बारे में अधिक कोड प्रदान कर सकते हैं? – tigrou

उत्तर

0

मैं एक समाधान नहीं मिला, यहाँ है कैसे मैं यह किया:

मैं इस तरह शब्दकोश परिभाषा संशोधित:

Dictionary<string, KeyValuePair<Func<T, object[], bool>, object[]>> 

(KeyValuePair, serializable है सिर्फ Dictionary की तरह)

और एक बनाया नई Add() समारोह:

public void Add(string key, Func<T, object[], bool> filter, params object[] args) 
{ 
    this.Add(key, new KeyValuePair<Func<T, object[], bool>, object[]> 
      (filter, args)); 
} 
,

int userId = int.Parse(DdlUsers.SelectedValue); 
DataSource.Filters.Add("userid", (u, args) => u.UserID == (int)args[0], userId); 

यह काम करता है, क्योंकि अब कब्जा कर लिया चर कोई और अधिक एक हिस्सा प्रतिनिधि हैं, लेकिन प्रतिनिधि के मापदंडों के रूप में दिया:

अब फिल्टर इस तरह से सेट किया जा सकता है।

4

अच्छा प्रश्न: छोटी से छोटी कोड समस्या पुन: पेश करने। मैं आपके निदान की पुष्टि कर सकता हूं (एक छोटे से सुधार के साथ: आधारभूत संरचना बंद करने वाले वर्ग को क्रमबद्ध करने की कोशिश करती है जिसमें शायद आपके पृष्ठ का संदर्भ शामिल है)।

आप अपनी खुद की बंद वर्ग को परिभाषित और हो सकता है कि धारावाहिक:

[Serializable] class Closure { int userId; bool Filter(User u) { ... } }; 

हालांकि सुविधाजनक नहीं है यही कारण है,।

मेरा सुझाव है कि आप एक अलग पैटर्न का उपयोग करें: "कोड" क्रमबद्ध न करें।फ़िल्टर द्वारा उपयोग डेटा को क्रमानुसार:

class FilterSettings { int userId; int someOtherFiler; string sortOrder; ... } 

हालांकि मैं सटीक कारण मैं पसंद करेंगे मैं intuitively पता है कि कि एक बेहतर तरीका है को इंगित नहीं कर सकते।

+0

धन्यवाद आप के लिए जवाब देने के लिए – tigrou

+0

एक वर्ग जिसका क्षेत्रों आप ठीक पर नियंत्रण पेज को कभी नहीं होगा भंडारण। कोई रास्ता नहीं serializer पेज बंद करने या FilterSettings से शुरू तक पहुँच सकते हैं नहीं है। – usr

+0

मैं अभी भी यह आप सुझावों के साथ भी काम नहीं कर सकता। मैंने प्रश्न के नीचे कोड का एक नमूना जोड़ा है जो समस्या को पुन: पेश करेगा। क्या आप एक नज़र देख सकते हैं और मुझे संकेत दे सकते हैं? – tigrou

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

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