2012-01-23 11 views
18

में एक बेनामी वस्तु यह शायद एक मूर्खतापूर्ण सवाल यह है कि भंडारण, लेकिन मैं तो जैसे ViewBag में एक गुमनाम वस्तु सामान के लिए कोशिश कर रहा हूँ: औरViewBag

ViewBag.Stuff = new { Name = "Test", Email = "[email protected]" }; 

इसलिए की तरह एक दृश्य से यह पहुँच:

@ ViewBag.Stuff.Name

मुझे लगता है कि व्यूबैग गतिशील है और "सामग्री" एक अनाम वस्तु है ... लेकिन जब मैं उपरोक्त व्यू लाइन से डीबगर को देखता हूं, तो मैं सभी गुणों को उचित मानों के साथ देख सकता हूं । मॉडल बाइंडर के साथ इतना कठिन समय क्यों है?

क्या मॉडल श्रेणी बनाने के बिना इसे पूरा करने का कोई अच्छा तरीका है? मैं new {}

+1

क्या आप @ ViewBag.Stuff.Name या @ ViewBag.Stuff.Email का उपयोग कर सकते हैं ?? कारण परीक्षण एक मान है और एक कुंजी/संपत्ति नहीं – SynerCoder

+0

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

+0

बाहर निकलता है, यह नहीं किया जा सकता है। इसे देखें: http://stackoverflow.com/questions/5649536/entity-framework- चयन- नया। – SoWeLie

उत्तर

7

अनिवार्य रूप से मुद्दा यह है कि अज्ञात प्रकार आंतरिक (see answer) के रूप में उत्पन्न होते हैं, जिससे ऑब्जेक्ट की संपत्ति के दृश्य से असंभव संदर्भ बनाते हैं। यह लेख एक अधिक विस्तृत विवरण प्रदान करता है:

http://www.heartysoft.com/anonymous-types-c-sharp-4-dynamic

यह एक गतिशील बेनामी आवरण वर्ग के उपयोग (@ Dakill का जवाब) के साथ पूरा करने के लिए संभव है, लेकिन बदसूरत तेजी से हो जाता है और एक प्रोग्रामर सवाल करना चाहिए कि क्यों वह/वह ऐसा करेगी।

+0

मुझे यह पता चल रहा है कि यह किया जा सकता है, और यदि नहीं, तो क्यों ... (आपको बीटीडब्ल्यू डाउनोट नहीं किया गया) –

+0

तो, मैं आपको एक और जवाब दूंगा। हालांकि, मैं अभी भी इस जवाब से खड़ा हूं कि यदि आप एक रखरखाव योग्य अनुप्रयोग बनाने की कोशिश कर रहे हैं तो आपको क्या करना चाहिए। – SoWeLie

5

लोकप्रिय धारणा के विपरीत, यह किया जा सकता है, लेकिन कुछ हद तक बदसूरत हैक शामिल है जो सड़क के नीचे रखरखाव की समस्याओं का कारण बन जाएगा .. इसमें एक कक्षा को लिखना आपके अज्ञात ऑब्जेक्ट को गतिशील वस्तु में "लपेटना" है। मैं इसे एक व्यायाम के रूप में कुछ समय पहले बनाया है, नीचे दिए गए आवरण वर्ग के लिए कोड, आप ViewBag.Stuff = new DynamicAnonymous(new { Name = "Test", Email = "[email protected]" }); की तरह उपयोग होता है ..

public class DynamicAnonymous : DynamicObject 
{ 
      object obj; 

      public DynamicAnonymous(object o) 
      { 
        this.obj = o; 
      } 

      public override IEnumerable<string> GetDynamicMemberNames() 
      { 
        return obj.GetType().GetProperties().Select(n => n.Name); 
      } 

      public override bool TryGetMember(GetMemberBinder binder, out object result) 
      { 
        var prop = obj.GetType().GetProperty(binder.Name); 
        if (prop == null) 
        { 
          result = null; 
          return false; 
        } 
        else 
        { 
          result = prop.GetValue(obj, null); 
          return true; 
        } 
      } 

      public override int GetHashCode() 
      { 
        return obj.GetHashCode(); 
      } 

      public override string ToString() 
      { 
        return obj.ToString(); 
      } 

      public override bool Equals(object obj2) 
      { 
        return obj.Equals(obj2); 
      }     
} 
+0

आपके उत्तर के लिए धन्यवाद। एक कार्य-आसपास प्रदान करने के लिए +1। –

0

आप इसे तंत्र NothingsImpossible descibed उपयोग कर सकते हैं, लेकिन withou को लागू करने के लिए अपने ExpandoObject का उपयोग कर अपने रैपर। यहां एक उदाहरण दिया गया है:

var items = _repository.GetItems() 
    .Select(og => { 
     dynamic eo = new System.Dynamic.ExpandoObject(); 
     eo.Id = item.Id; 
     eo.FriendlyName = og.FriendlyName; 
     eo.Selected = itemIds.Contains(item.Id); 
     return eo; 
    }) 
    .ToArray(); 
ViewBag.Items = items; 
संबंधित मुद्दे