2015-01-16 6 views
6

मैं एक सामग्री क्षेत्र कुछ ब्लॉक होगा जो है, इन ब्लॉकों में से कुछ गुण एक SQL क्वेरी से डेटा के साथ प्रारंभ किया जाना चाहिए करने के लिए ब्लॉक जोड़ें, ताकि नियंत्रक में मैं कुछ इस तरह है:EpiServer - एक सामग्री क्षेत्र प्रोग्राम के रूप में

foreach (ObjectType item in MyList) 
{ 
    BlockData currentObject = new BlockData 
    { 
     BlockDataProperty1 = item.ItemProperty1, 
     BlockDataProperty2 = item.ItemProperty2 
    }; 
    /*Dont know what to do here*/ 
} 

मुझे क्या चाहिए, currentObject के साथ एक ब्लॉक के रूप में काम करना है, और इसे किसी अन्य ब्लॉक में परिभाषित सामग्री क्षेत्र में जोड़ना है। मैं

myContentArea.Add(currentObject) 

उपयोग करने की कोशिश, लेकिन यह यह है क्योंकि यह एक IContent प्रकार के लिए उम्मीद कर रही है एक सामग्री क्षेत्र में एक वस्तु नहीं जोड़ सकते हैं कहते हैं।

मैं उस ऑब्जेक्ट को IContent में कैसे डाल सकता हूं?

उत्तर

8

EPiServer में सामग्री बनाने के लिए आप IContentRepositorynew के बजाय ऑपरेटर का एक उदाहरण का उपयोग करने की जरूरत है:

// add new block to the target block content area 
writableTargetBlock.MyContentArea.Items.Add(new ContentAreaItem 
{ 
    ContentLink = ((IContent) newBlock).ContentLink 
}); 

repo.Save((IContent) writableTargetBlock, SaveAction.Publish); 
: यदि आप सामग्री क्षेत्र के ब्लॉक को जोड़ने के लिए सक्षम हो जाएगा उसके बाद

var repo = ServiceLocator.Current.GetInstance<IContentRepository>(); 

// create writable clone of the target block to be able to update its content area 
var writableTargetBlock = (MyTargetBlock) targetBlock.CreateWritableClone(); 

// create and publish a new block with data fetched from SQL query 
var newBlock = repo.GetDefault<MyAwesomeBlock>(ContentReference.GlobalBlockFolder); 

newBlock.SomeProperty1 = item.ItemProperty1; 
newBlock.SomeProperty2 = item.ItemProperty2; 

repo.Save((IContent) newBlock, SaveAction.Publish); 

EPiServer रनटाइम में ब्लॉक के लिए प्रॉक्सी ऑब्जेक्ट बनाता है और वे IContent इंटरफ़ेस को लागू करते हैं। जब आपको ब्लॉक पर IContent सदस्य का उपयोग करने की आवश्यकता होती है, तो इसे स्पष्ट रूप से IContent पर डालें।

जब आप new ऑपरेटर का उपयोग करके ब्लॉक बनाते हैं, तो वे डेटाबेस में सहेजे नहीं जाते हैं। एक और समस्या यह है कि सामग्री क्षेत्र ऐसी वस्तुओं को स्वीकार नहीं करता है, क्योंकि वे IContent इंटीफ्रेस लागू नहीं करते हैं (आपको IContentRepository से ब्लॉक प्राप्त करने की आवश्यकता है जो रनटाइम में प्रॉक्सी बनाता है)।

+0

उत्तर के लिए धन्यवाद, ऐसा लगता है कि यह काम कर रहा है, लेकिन अभी भी एक समस्या है, लाइन repo.Save (newBlock, SaveAction.Publish); एक त्रुटि बताता है कि सहेजने के लिए सबसे अच्छा अधिभार कुछ अमान्य तर्क है, पहले से ही repo.Save (newBlock, SaveAction.Publish, AccessLevel.Administer); और आईसीओन्टेंट रिपोजिटरी सेव (रेपो, न्यूब्लॉक, सेव एक्शन। प्रकाशित) – rhernandez

+0

हाँ, वही 'आईकॉन्टेंट' कास्ट मुद्दा जैसा दिखता है। 'Repo.Save ((IContent) newBlock, SaveAction.Publish) का प्रयास करें; ' – whyleee

+0

यह काम करता है! अब डेटा को ब्लॉक के रूप में दिखा रहा है और संपादन योग्य गुण ठीक काम कर रहे हैं। बस एक और सवाल (मुझे यकीन नहीं है कि अगर मैं एक और धागा खोलता हूं) ब्लॉक सही तरीके से जोड़े जा रहे हैं, लेकिन जब मैं मूल घटक पर जाता हूं, तो सामग्री एरिया खाली दिखती है, इसलिए मैंने जांच की और महसूस किया कि ब्लॉक को जोड़ा जा रहा है वैश्विक सहायता फ़ोल्डर, संपादन मोड में सामग्री क्षेत्र में दिखाए जाने वाले घटक को मैं "बताएं" कैसे कर सकता हूं? मैं इस समाधान के साथ कोशिश कर रहा हूं http://joelabrahamsson.com/custom-rendering-of-content-areas/ लेकिन अब तक मेरे लिए काम नहीं कर रहा है। धन्यवाद – rhernandez

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