2011-11-16 12 views
6

मैं सी # में इस कार्रवाई विधि है:एफ # में ViewBag गतिशील वस्तु पर एक प्रॉपर्टी सेट

public ActionResult Index() { 
     ViewBag.Message = "Hello"; 
     return View(); 
    } 

और यह दृश्य (Index.cshtml):

<h2>@ViewBag.Message</h2> 

और यह पैदा करता है पृष्ठ पर अपेक्षित "हैलो"।

मैं एफ # में नियंत्रक करना चाहता हूं। मैं

type MainController() = 
    inherit Controller() 
    member x.Index() = 
    x.ViewBag?Message <- "Hello" 
    x.View() 

की कोशिश की है और यह त्रुटि संदेश "विधि या वस्तु निर्माता 'op_DynamicAssignment' नहीं मिला" पैदा करता है।

मैंने गतिशील ऑपरेटर के लिए कुछ एफ # कोड नमूने देखे हैं, और मैं कुछ भी नहीं देख सकता जो विवरण के कई पृष्ठों और कोड की कई पंक्तियों से कम है। वे इस संपत्ति "सेटटर" के लिए बहुत सामान्य प्रतीत होते हैं।

उत्तर

10

ViewBag संपत्ति सिर्फ एक आवरण है कि प्रकार dynamic की एक संपत्ति के रूप में ViewData संग्रह को उजागर करता है, इतना है कि यह सी # का उपयोग करके डायनामिक पहुँचा जा सकता है है (संपत्ति सेट वाक्यविन्यास का उपयोग कर)। आपको लगता है कि (this discussion at SO देखें) करने के लिए डीएलआर के आधार पर ? के कार्यान्वयन इस्तेमाल कर सकते हैं, लेकिन यह ? ऑपरेटर कि ViewDataDictionary डेटा को सीधे जोड़ता है (ViewData संपत्ति से सामने आ रहा है जो) को परिभाषित करने के लिए आसान है: आप फिर

let (?<-) (viewData:ViewDataDictionary) (name:string) (value:'T) = 
    viewData.Add(name, box value) 

x.ViewData?Message <- "Hello" 
+0

यय! इसने काम कर दिया! :) –

+0

# टॉमस क्रेडिट दे रहा है जहां यह देय है, मैंने आपके एफ # खाली वेब टेम्पलेट का उपयोग http://msdn.microsoft.com/en-us/library/hh304375.aspx में वर्णित किया है, इस कोड को केवल एक मिनट में उत्पन्न करने के लिए (लेकिन वास्तविक परियोजना में समस्या उत्पन्न हुई)। –

+0

मुझे इसे टेम्पपडाटा के लिए भी प्रदान करने की आवश्यकता थी, इसलिए पहले पैरामीटर को '(शब्दकोश: आईडीकी ) में बदल दिया गया' –

1

बजाय

x?ViewBag <- "Hello" 

प्रयास करें:

x.ViewBag?Message <- "Hello" 
+0

लिखने में सक्षम होना चाहिए। मैंने ऐसा किया है लेकिन यह अभी भी "विधि या ऑब्जेक्ट कन्स्ट्रक्टर" op_DynamicAssignment 'नहीं मिला "उत्पन्न करता है। मैंने इस सुझाव को शामिल करने के लिए उस प्रश्न को संपादित किया है। –

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