मेरे पास एक सर्वरसाइड कोड है जहां मैं डेटाबेस से अनाम वर्ग की सूची लौटा रहा हूं:
public ActionResult DisplayMap()
{
ViewBag.Checkins = (from locationUpdate in db.LocationUpdates
select new
{
locationUpdate,
locationUpdate.User
}).ToList();
return View();
}
रेज़र पृष्ठ पर, मैं इस सूची की गिनती प्राप्त करना चाहता हूं:
@if (ViewBag.Checkins.Count() > 0)
{ ... }
हालाँकि, यह एक त्रुटि फेंकता है:
An exception of type "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException" occurred
in System.Core.dll but was not handled in user code.
Additional information: "object" does not contain a definition for "Count"
जब मैं टाइप करता हूं ViewBag.Checkins
तत्काल विंडो में, मुझे मिलता है:
ViewBag.Checkins
{System.Collections.Generic.List<<>f__AnonymousType6<MY_APP.LocationUpdate,MY_APP.User>>}
[0]: { locationUpdate = {System.Data.Entity.DynamicProxies.LocationUpdate_4532566693B61EF657DDFF4186F1D6802EA1AC8D5267ED245EB95FEDC596E129}, User = {System.Data.Entity.DynamicProxies.User_816C8A417B45FE8609CD1F0076A5E6ECBAB0F309D83D2F8A7119044B1C6060CF} }
The Checkins
वस्तु वास्तव में एक List
, और डेटा सही है । मैं "ve की कोशिश की Count
, Length
भी (विधि कॉल के बिना, बस गुण के रूप में), लेकिन कोई भाग्य ।मैं गलत क्या कर रहा हूं?
उत्तर:
उत्तर № 1 के लिए 17ViewBag
है dynamic
, जबकि Count
है एक विस्तार विधि, जो isn "टी गतिशील रूप से समर्थित (यह बाध्य होना है compile समय)।
आप या तो डाल सकते है एक IEnumerable<dynamic>
, या स्थैतिक विधि का सीधे उपयोग करें:
@if (((IEnumerable<dynamic>)ViewBag.Checkins).Count() > 0)
या
@if (Enumerable.Count(ViewBag.Checkins) > 0)
या एक मजबूती से टाइप मॉडल बनाने के साथ एक Checkins
संपत्ति और बचो ViewBag
कुल मिलाकर।
संपादित करें
जब से तुम "फिर से सिर्फ अगर गिनती 0 से अधिक है जांच करना चाहते हैं, Any
अधिक उपयुक्त है (और कुछ संसाधन समय परिदृश्य के आधार पर सहेज सकते हैं):
@if (Enumerable.Any(ViewBag.Checkins))
उत्तर № 2 के लिए 1
viewbag गतिशील है जो इसे एक गुमनाम आंतरिक रूप में उत्पंन प्रकार बनाते हैं ।यह बेहतर है कि आप दृश्य मॉडलों के बजाय का उपयोग करें ।
और फिर अपने मॉडल के साथ दृश्य कॉल, कुछ इस तरह करते हैं:
public class MyViewModel{
LocationUpdate LocationUpadte{get;set;}
User User{get;set;}
}
public ActionResult DisplayMap()
{
var model = (from locationUpdate in db.LocationUpdates
select new MyViewModel
{
locationUpdate,
locationUpdate.User
}).ToList();
return View(model);
}
फिर में तुम्हे उस्तरा देखने
@Model.Count()
अपेक्षित मान वापस होगा
जवाब के लिए 0 № 3
आप अपने वस्तु कास्ट के बाद से viewbag गतिशील है की जरूरत है ।उदाहरण के लिए:
var list = ViewBag.List as List<int>();
list.Count();
उत्तर के लिए -3 № 4
तुम यह केर सकते हो:
- @if(ViewBag.Checkins.Count > 0)