2009-07-24 14 views
12

क्या यह संभव है?डायनामिक टाइपेड व्यूपेज

public ActionResult Index() 
    { 
     dynamic p = new { Name = "Test", Phone = "111-2222" }; 
     return View(p); 
    } 

और फिर मेरे विचार System.Web.Mvc.ViewPage<dynamic> से विरासत और Model.Name प्रिंट आउट की कोशिश करता है: यहाँ मैं क्या कोशिश कर रहा हूँ है। इसके संरक्षण के स्तर

की वजह से '<> f__AnonymousType1.Name' दुर्गम है तो बुनियादी तौर पर, क्या मैं सिर्फ संभव नहीं करने के लिए कोशिश कर रहा हूँ:

मैं एक त्रुटि हो रही है? क्यों या क्यों नहीं?

अद्यतन: यहाँ मेरे विचार

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

<asp:Content ...> 
    <%=Model.Name%> 
    <%=Model.Phone%> 
</asp:Content> 

निर्माता देखें ढांचे के लिए निर्मित कर रहा है।

+1

क्या आप अपना अधिक कोड पोस्ट कर सकते हैं? मैं विशेष रूप से – Randolpho

+1

देखने के लिए निर्माता को देखना चाहता हूं फिल हैक के ब्लॉग पोस्ट के लिंक के साथ अपना नवीनतम अपडेट देखें। – CoderDennis

उत्तर

7

अज्ञात प्रकार किसी विधि द्वारा वापस नहीं किए जा सकते हैं; वे केवल उस विधि के दायरे में मान्य हैं जिसमें उन्हें परिभाषित किया गया है।

आपको एक मॉडल श्रेणी का उपयोग करना चाहिए जिसे आपने पहले परिभाषित किया था और इसे अपने दृश्य में पास कर दिया था। मॉडल श्रेणी को पार करने में कुछ भी गलत नहीं है जिसमें प्रत्येक फ़ील्ड परिभाषित नहीं है।

अद्यतन:

मुझे लगता है कि मैं गलत पहले था। यह काम करना चाहिए। शायद समस्या दृश्य के भीतर है। क्या आप अधिक कोड पोस्ट कर सकते हैं? विशेष रूप से देखें और इसके निर्माता।

अद्यतन दूसरा:

ठीक है, मैं एक गतिशील चर के रूप में इस्तेमाल के लिए एक और तरीका करने के लिए एक गुमनाम प्रकार गुजर के बारे में गलत था - कि किया जा सकता है।

लेकिन मैं भी अपने विश्वास में गलत था कि आप जो करने की कोशिश कर रहे हैं वह काम करेगा। दुर्भाग्य से आपके लिए, यह नहीं होगा। समस्या यह है कि आप ViewPage<TModel> का उपयोग कर रहे हैं, जो आंतरिक रूप से ViewDataDictionary<TModel> का उपयोग करता है। क्योंकि उन्हें मजबूत प्रकार की आवश्यकता होती है, इसलिए आप उनके साथ गतिशील वस्तुओं का उपयोग करने में सक्षम नहीं होंगे। आंतरिक संरचना आंतरिक रूप से गतिशीलता का उपयोग नहीं करती है, और गतिशील निर्दिष्ट करती है क्योंकि प्रकार विफल रहता है।

DynamicViewPage कक्षा और संबंधित DynamicViewDataDictionary कक्षा जो object स्वीकार करती है और इसे आंतरिक रूप से गतिशील के रूप में संग्रहीत करने की आवश्यकता होगी। फिर आप एक अनाम प्रकार का उपयोग कर सकते हैं और इसे अपने दृश्यों में भेज सकते हैं।

उसने कहा, आपको कुछ भी हासिल नहीं होगा। आप अपने विचारों को निर्दिष्ट करने में सक्षम होंगे जैसा कि आपने किया है (यानी <%=Model.Name%>), लेकिन आपको मजबूत टाइपिंग से लाभ नहीं होगा। कोई इंटेलिजेंस नहीं होगा और कोई प्रकार की सुरक्षा नहीं होगी। @Dennis Palmer के सुझाव के रूप में आप untyped ViewDataDictionary का उपयोग करने के लिए भी करेंगे।

यह एक दिलचस्प (और दुर्भाग्य से मेरे लिए, अवशोषित) विचार प्रयोग किया गया है, लेकिन मुझे लगता है, आखिरकार, ऐसा नहीं होने वाला है। या तो सार्वजनिक प्रकार घोषित करें और इसे अपने दृश्यों में पास करें, या अवांछित शब्दकोश का उपयोग करें।

+1

लेकिन मैं प्रतिबिंब के माध्यम से वस्तु के सदस्यों तक पहुंच सकता था, इसलिए मैंने सोचा कि गतिशील टाइपिंग काम कर सकती है। –

+1

हम्म ...और आपकी त्रुटि से पता चलता है कि यह आपके व्यू के भीतर से होता है, जिसका अर्थ यह है कि गुमनाम प्रकार को देखने के लिए काम करता है, लेकिन नाम का डिफ़ॉल्ट सुरक्षा स्तर सुरक्षित या निजी है। और जब आप इसे घोषित करते हैं तो आप अज्ञात प्रकार के सुरक्षा स्तर को निर्दिष्ट नहीं कर सकते हैं। – Randolpho

+0

ठीक है, मैंने एक अद्यतन पोस्ट किया है। –

7

गतिशील प्रकार का उपयोग करने से आप क्या लाभ प्राप्त करने की उम्मीद कर रहे थे?

व्यूडेटा शब्दकोश का उपयोग करना आपके व्यू आउटपुट में मनमानी ऑब्जेक्ट्स/आइटम जोड़ने का एक बहुत ही आसान तरीका है।

आपको अपने दृश्य में संपत्ति के नाम प्राप्त करने के लिए प्रतिबिंब की आवश्यकता नहीं है। नामों का संग्रह प्राप्त करने के लिए बस ViewData.Keys का उपयोग करें।

संपादित करें: मैंने अभी गतिशीलता के बारे में कुछ और सीखा है और मुझे लगता है कि आपको DynamicObject से प्राप्त अपनी गतिशील ऑब्जेक्ट क्लास बनाने की आवश्यकता है। आप उस कक्षा में एक निजी शब्दकोश चाहते हैं और फिर TrySetMember और TryGetMember ओवरराइड करना चाहते हैं।

इसके अलावा संपादित करें: मुझे लगता है कि दृढ़ता से टाइप किए गए व्यूमोडेल का एक लाभ यह है कि आप इसे अपने पोस्ट एक्शन विधियों में पैरामीटर के रूप में स्वीकार कर सकते हैं। एमवीसी ढांचा मॉडल बाध्यकारी को संभालेगा और एक्शन विधि में आपके पास बस आपके व्यूमोडेल क्लास का एक उदाहरण होगा। मुझे नहीं लगता कि आपके पास एक गतिशील के साथ वह लाभ होगा, भले ही वे काम करते हों।

परिणाम संपादित करें: ठीक है, मैंने डायनामिक ऑब्जेक्ट से प्राप्त कक्षा का उपयोग करने का प्रयास किया, लेकिन दृश्य प्रस्तुत करने का प्रयास करते समय वीएस -2010 क्रैश हो गया। मुझे कोई अपवाद नहीं मिला, बस एक कठिन दुर्घटना और विजुअल स्टूडियो पुनरारंभ होता है। यहां कोड है जिसके साथ मैं दुर्घटना का कारण बनता हूं।

कस्टम गतिशील वर्ग:

public class DynViewModel : DynamicObject 
{ 
    private Dictionary<string, object> ViewDataBag; 
    public DynViewModel() 
    { 
     this.ViewDataBag = new Dictionary<string, object>(); 
    } 
    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     this.ViewDataBag[binder.Name] = value; 
     return true; 
    } 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = this.ViewDataBag[binder.Name]; 
     return true; 
    } 
} 

नियंत्रक में:

public ActionResult DynamicView() 
{ 
    dynamic p = new DynamicViewModel.Models.DynViewModel(); 
    p.Name = "Test"; 
    p.Phone = "111-2222"; 

    return View(p); 
} 

मेरा विचार मूल रूप से क्या सवाल में सूचीबद्ध है के रूप में ही है:

<p>Name: <%=Model.Name %></p> 
<p>Phone: <%=Model.Phone %></p> 

मेरे निष्कर्ष: यह काम कर सकता है, लेकिन वीएस -2010 के बीटा 1 में मैं नहीं कर सकता पता लगाएं कि मेरा कोड विजुअल स्टूडियो को क्रैश क्यों करता है। वीएस -2010 बीटा 2 में इसे फिर से कोशिश की जाएगी जब इसे रिलीज़ किया जाएगा क्योंकि यह गतिशीलता के बारे में सीखने में एक दिलचस्प अभ्यास है। हालांकि, यहां तक ​​कि अगर यह काम करना था, तो भी मुझे व्यूडाटा शब्दकोश का उपयोग करने पर कोई फायदा नहीं दिख रहा है।

बचाव के लिए फिल हैक! यहां फिल हैक द्वारा एक ब्लॉग पोस्ट है जो आपकी मदद कर सकता है। ऐसा लगता है कि आप यही चाहते थे। Fun With Method Missing and C# 4

+0

ठीक है, मैं अभी तक वास्तव में 100% निश्चित नहीं हूं, मैं बस 4.0 के साथ थोड़ा सा प्रयोग कर रहा हूं। मुझे लगता है कि मैं जो देखना चाहता हूं वह व्यूमोडेल पैटर्न का उपयोग करने की क्षमता है, वास्तव में स्पष्ट रूप से व्यूमोडल्स का एक गुच्छा लिखने के बिना, लेकिन मैं भी सी # में गतिशील टाइपिंग की गहरी समझ प्राप्त करने की कोशिश कर रहा हूं। –

1

वास्तविक त्रुटि यहां (<>f__AnonymousType1.Name' is inaccessible due to its protection level) अज्ञात प्रकारों का उपयोग करने का परिणाम है। बेनामी प्रकार निहित internal (कम से कम सी # में) हैं, इसलिए उन्हें केवल उसी असेंबली से ही एक्सेस किया जा सकता है। चूंकि आपका दृश्य रनटाइम पर अलग असेंबली में संकलित किया गया है, इसलिए यह internal अनाम प्रकार तक नहीं पहुंच सकता है।

समाधान कंक्रीट/नामित कक्षाओं को आपके दृश्य में मॉडल के रूप में पारित करना है। यदि आप चाहें तो दृश्य स्वयं भी dynamic का उपयोग कर सकता है।

1

.NET 4.0 पर अज्ञात प्रकार आसानी से ExpandoObjects में परिवर्तित हो सकते हैं और इस प्रकार सभी समस्याओं को रूपांतरण के ऊपरी हिस्से के साथ तय किया जाता है। here

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