2012-11-12 15 views
5

के भीतर अलग-अलग कक्षा से VisualWebPart (.cs) में C# विधि को कॉल करने के लिए कैसे मैं सी # और शेयरपॉइंट प्रोग्रामिंग के लिए बहुत नया हूं।एक ही नामस्थान

मैं वेबपर्ट और सी # के बारे में जानने के लिए प्रयास कर रहा हूं। मैंने एक दृश्य वेबपर्ट बनाया जो सूची में आइटम जोड़ता/हटा देता है। मेरे पास एक विधि है जिसे बटन पर क्लिक किया जाता है जो सूची में आइटम जोड़ता है।

protected void Button1_Click(object sender, EventArgs e) 
{ 
    TestMethod(); 
} 

यह ठीक काम करता है:

public void TestMethod() 
{ 
    using (SPSite oSPSite = SPContext.Current.Site) 
    { 
     using (SPWeb ospweb = oSPSite.OpenWeb()) 
     { 
      SPList lst = ospweb.Lists["CusomList1"]; 

      SPListItem item = lst.Items.Add(); 

      item["Item1"] = txt1.Text; 
      item["Item2"] = txt3.Text; 
      item["Item3"] = Convert.ToInt32(txt3.Text); 
      item["Item4"] = txt4.Text; 
      item.Update(); 
     } 
    }    
} 

यह भी कहा जाता है:

यहाँ मेरी विधि है। मैं एक ही वेबपर्ट पर एक ही विधि का उपयोग करने की कोशिश कर रहा हूं जो वही काम करता है (आइटम जोड़ें)।

हालांकि मैं एक ही परियोजना पर एक नया दृश्य webpart जोड़ा गया है और काम नहीं करता वर्ग और

protected void Button1_Click(object sender, EventArgs e) 
{ 
    VWP1 NewClass = new VWP1(); 
    NewClass.TestMethod(); 
} 

बटन इस जोड़े के रूप में विधि कहा जाता है जब और जब मैं एक डिबग मैं निम्न संदेश मिलता है:

Object reference not set to an instance of an object.

क्या कोई मुझे बता सकता है कि मुझे क्या करना चाहिए?

उत्तर

1

आपको जो करना है वह उपयोगकर्ता इंटरफ़ेस के साथ बातचीत के तर्क से सूची में आइटम को सहेजने के तर्क को अलग करता है।

public static void SaveItem(string item1, string item2, int item3, string item4)//TODO rename parameters 
{ 
    SPListItem newItem = SPContext.Current.Web.Lists["CusomList1"].AddItem(); 
    //set fields of new item 
    newItem.Update(); 
} 

तो फिर तुम कहीं एक उपयोगिता कक्षा में है कि विधि रख सकते हैं:

एक अलग समारोह है कि डेटा बचाया जा लेता है और यह बचाता है बनाओ।

के बाद आप यह कर लें तो आप webparts में से प्रत्येक से विधि कॉल कर सकते हैं:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    MyUtilityClass.SaveItem(txt1.Text, txt2.Text, Convert.ToInt32(txt3.Text), txt4.Text); 
} 

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

कई पक्ष नोट:

  • आप एक using ब्लॉक में वर्तमान संदर्भ के SPSite डाल; जो इसका निपटान करेगा। ऐसा न करें। केवल आपके द्वारा बनाई गई साइट/वेब ऑब्जेक्ट का निपटान करें। वर्तमान संदर्भ की साइट/वेब ऑब्जेक्ट्स को विभिन्न अनुरोधों के लिए दोबारा उपयोग किया जाता है; यदि आप इसका निपटान करते हैं कि अनुरोध काम करेगा, लेकिन जब डिस्प्ले ऑब्जेक्ट अगले अनुरोध पर पास हो जाएगा तो यह टूट जाएगा, और त्रुटियों को डीबग करना मुश्किल होता है क्योंकि समस्या पूरी तरह से किसी अन्य अनुरोध में होती है।
  • आप उस उदाहरण में एक नया वेब खोलें; क्या आप सुनिश्चित हैं कि वर्तमान संदर्भ का वेब उपयुक्त नहीं है? यदि यह नहीं है, और आप वास्तव में रूट वेब चाहते हैं और हमेशा रूट वेब पर नहीं होंगे, तो आप इसे नया खोलने के बिना SPContext.Current.Web.RootWeb का उपयोग कर सकते हैं।
  • आप उपयोगकर्ता द्वारा प्रदान किए गए मूल्य पर Convert.ToInt32 का उपयोग कर रहे हैं। यदि वे अल्पविराम शामिल हैं, तो वे उचित संख्या में प्रवेश नहीं करते हैं, तो यह तोड़ देगा। int.TryParse का उपयोग करने पर विचार करें ताकि यदि आप अमान्य मान दर्ज करते हैं तो आप अधिक गहराई से असफल हो सकते हैं।
  • आपको आइटम जोड़ने के लिए list.Items.Add() का उपयोग नहीं करना चाहिए; आपको list.AddItem() का उपयोग करना चाहिए। Items.Add को बहिष्कृत माना जाता है।
+0

मैंने कहीं पढ़ा है कि एक 'का प्रयोग' बयान कुछ हद तक महत्वपूर्ण जब विंडोज SharePoint सेवाएँ वस्तुओं का उपयोग करके Microsoft .NET फ्रेमवर्क में स्मृति में वस्तुओं को बनाए रखना से बचना है। क्या यह सही नहीं है? –

+1

@AndresAdhi आपके द्वारा बनाई गई 'SPSite'/'SPWeb' ऑब्जेक्ट्स का निपटान करना बहुत महत्वपूर्ण है। साइट/वेब ऑब्जेक्ट्स का निपटान करने के लिए यह उतना ही महत्वपूर्ण नहीं है जिसे आपने नहीं बनाया था। बस सब कुछ के आसपास 'उपयोग' डालने से समस्याएं पैदा होंगी; आपको यह जानने की जरूरत है कि यह कब है और उचित नहीं है। आपको वर्तमान संदर्भ का निपटान नहीं करना चाहिए। – Servy

+0

बस अपनी समझ को आगे बढ़ाने के लिए मैं http://solutionizing.net/2008/12/06/the-new-definitive-spsitespweb-disposal-article/ को पढ़ने का सुझाव देना होगा निपटान +1 के बारे में सलाह का अच्छा टुकड़ा! अगर आपको ऑब्जेक्ट को निपटाने के बारे में कोई चिंता हो तो भी देखें http://archive.msdn.microsoft.com/SPDisposeCheck – Truezplaya

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