2013-03-08 5 views
10

पर पासिंग सूची में मेरे पास व्यू बैग का उपयोग करके मेरे नियंत्रक से मेरे दृश्य में आने वाले उपयोगकर्ताओं की एक सूची है। अब मुझे पृष्ठ पर जावास्क्रिप्ट पर एक ही सूची उत्तीर्ण करने में सक्षम होना चाहिए। मैं एक foreach पाश का उपयोग कर सूची को फिर से संगठित कर सकते हैं:एमवीसी व्यूबैग से जावास्क्रिप्ट

@foreach (var item in ViewBag.userList) //Gets list of users passed from controller and adds markers to the map 
{ 
    var userLat = item.LastLatitude; 
    var userLon = item.LastLongitude; 
    var _userId = item.Id; 

    <script>array.push({"userId":"'@_userId'","userLat":"'@userLat'","userLon":"'@userLon'"});</script> 
} 

हालांकि यह एक गंदा दृष्टिकोण की तरह लगता है और दोबारा काम करता है, तो एक परिवर्तन किया है की एक बहुत कुछ की आवश्यकता है। मुझे पता है कि स्टैक ओवरफ़्लो पर समान पोस्ट हैं, लेकिन उनमें से बहुत से एमवीसी के पिछले संस्करण का उपयोग करते हैं और एक ही वाक्यविन्यास लागू नहीं होता है। कोई विचार?

उत्तर

20

आप जेएसओएन पार्सर का उपयोग कर कोड की एक और सुरक्षित लाइन में ऐसा कर सकते हैं। जैसा कि आपने अपने उदाहरण में करने का प्रयास किया था, आपको बिल्कुल कुछ स्ट्रिंग कॉन्सटेनेशन और सामान के साथ मैन्युअल रूप से जेएसओएन का निर्माण नहीं करना चाहिए। किसी भी लूप को लिखने की जरूरत नहीं है।

<script type="text/javascript"> 
    var array = @Html.Raw(
     Json.Encode(
      ((IEnumerable<UserModel>)ViewBag.userList).Select(user => new 
      { 
       userId = user.Id, 
       userLat = user.LastLatitude, 
       userLon = user.LastLongitude 
      }) 
     ) 
    ); 

    alert(array[0].userId); 
</script> 

सृजित HTML दिखेगा बिल्कुल के रूप में आप उम्मीद:

<script type="text/javascript"> 
    var array = [{"userId":1,"userLat":10,"userLon":15}, {"userId":2,"userLat":20,"userLon":30}, ...]; 
    alert(array[0].userId); 
</script> 
बेशक

इस कोड में सुधार के अगले स्तर छुटकारा पाने के लिए किया जाता है

यहाँ ऐसा करने के लिए सही रास्ता है ViewCrap का और दृढ़ता से टाइप किए गए दृश्य मॉडल का उपयोग करें।

+0

त्वरित और विस्तृत उत्तर के लिए धन्यवाद! लेकिन मुझे निम्न त्रुटि मिलती है 'बिना किसी गतिशील रूप से प्रेषित ऑपरेशन के तर्क के रूप में लैम्ब्डा अभिव्यक्ति का उपयोग नहीं कर सकता ...'। उस भाग के साथ में मुझे एक त्रुटि भी मिलती है 'विधि के लिए प्रकार तर्क ... उपयोग से अनुमानित नहीं किया जा सकता है'। मदद के लिए धन्यवाद, और खेद है कि यह एक रूकी गलती है। अनुलेख मैं इस पृष्ठ पर किसी और चीज़ के लिए व्यू मॉडल का उपयोग कर रहा हूं, इसलिए मैं व्यू बैग का उपयोग कर रहा हूं। – Matt

+0

लेकिन एक व्यू मॉडल एक वर्ग है जिसे आप विशेष रूप से अपने दृश्य की आवश्यकताओं को पूरा करने के लिए डिज़ाइन करते हैं। इस मामले में आपके दृश्य को इस गतिशील जावास्क्रिप्ट को उत्पन्न करने की आवश्यकता है। तो आपके व्यू मॉडल में 'IEnumerable 'प्रकार की संग्रह संपत्ति होनी चाहिए। और फिर बस पूरे कलाकार को 'मॉडल.उसर' के साथ बदलें। चयन करें (...) '।यदि आप कमजोर टाइप किए गए व्यूबैग को छोड़ देते हैं तो आपको इसे उचित 'IEnumerable ' प्रकार पर डालना होगा। –

+0

ठीक है मैंने पृष्ठ को तुरंत संशोधित किया और दृश्य मॉडल का उपयोग किया और यह काम किया। मुझे आपके उत्तरों में से किसी एक को भी संदर्भित करना पड़ा http://stackoverflow.com/questions/12111729/razor-javascript-and-trailing-semicolon, VS2012 में इस बग के बारे में नहीं पता था। महान और सूचनात्मक उत्तर के लिए धन्यवाद! – Matt

2

एक और विकल्प, आपके नियंत्रक में एक JsonResult लौटने में एक नई कार्रवाई करने के लिए हो सकता है। यह जेसन परिणाम आपकी सूची वापस कर सकता है। अपने पृष्ठ में आप jquery के साथ कार्रवाई को कॉल कर सकते हैं और वहां से इसका उपयोग कर सकते हैं।

public ActionResult GetMyList() 
{ 
    var list = GetMyUserList(); 

    return Json(new { userlist = list }, JsonRequestBehaviour.AllowGet); 
} 
+0

टिप के लिए धन्यवाद, मैं इसे भी आजमाउंगा :) – Matt

1

@ डारिन डिमिट्रोव उत्तर स्पॉट पर है। अगर कोई मॉडल पास कर रहा है और व्यूबैग नहीं है तो मैं इसे जोड़ना चाहूंगा।

<script type="text/javascript"> 
var array = @Html.Raw(Json.Encode(
      Model.YourModel.Select(_ => new { 
       id = _.Id, 
       text = _.Name 
      }) 
     )) 

मेरा उपयोग केस select2 के लिए विशिष्ट था। एक तो बस आंकड़ों के सरणी पारित कर सकते हैं: विशेषता

$("#storeSelect").select2({ 
     data: array, 
     placeholder: "Select something" 
}); 
</script> 

viewmodel

public class YourViewModel 
    { 
    public IEnumarable<YourPoco> YourPocos { get; set; } 
    } 

नियंत्रक

public class YourController : Controller 
{ 
    public ActionResult Index() 
    { 
     YourViewModel vm = new YourViewModel{ 
      // Using Dependancy injection 
      YourPocos = yourRepo.GetYourPocos(); 
     }; 
     return View("Index", "_Layout",vm); 
    } 
} 

मुझे पता है क्या यह उत्तर बेमानी हो सकता है, लेकिन यह है पहली बार मैं जेसन का उपयोग कर रहा हूं। एक jquery एक्सटेंशन में मॉडल मानों को एन्कोड और पास करना। यह मेरे लिए बहुत अच्छा है। यह एक निश्चित डिग्री के लिए बड़े पैमाने पर विस्तारशीलता बनाता है जो अन्यथा @htmlhelper

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