रेजर एमवीसी मॉडल एरे के साथ जावास्क्रिप्ट सरणी को आबाद करता है


100

मैं अपने मॉडल से एक सरणी के साथ एक जावास्क्रिप्ट सरणी लोड करने की कोशिश कर रहा हूं। यह मुझे लगता है कि यह संभव होना चाहिए।

न तो नीचे दिए गए तरीके काम करते हैं।

जावास्क्रिप्ट चर के साथ मॉडल ऐरे के माध्यम से एक जावास्क्रिप्ट लूप और वेतन वृद्धि नहीं कर सकते

for(var j=0; j<255; j++)
{
    jsArray = (@(Model.data[j])));
}

रेजर लूप नहीं बना सकते, जावास्क्रिप्ट दायरे से बाहर है

@foreach(var d in Model.data)
{
    jsArray = d;
}

मैं इसे काम करने के लिए प्राप्त कर सकता हूं

var jsdata = @Html.Raw(Json.Encode(Model.data)); 

लेकिन मुझे नहीं पता कि मुझे JSON का उपयोग क्यों करना चाहिए।

इसके अलावा, इस समय मैं इसे 255 बाइट्स तक सीमित कर रहा हूं। भविष्य में यह कई एमबी में चल सकता है।


1
आप js में रेजर का उपयोग कर सकते हैं लेकिन इसके विपरीत नहीं
एहसान सज्जाद

जवाबों:


216

यह संभव है, आपको केवल रेजर संग्रह के माध्यम से लूप करने की आवश्यकता है

<script type="text/javascript">

    var myArray = [];

    @foreach (var d in Model.data)
    {
        @:myArray.push("@d");
    }

    alert(myArray);

</script>

उम्मीद है की यह मदद करेगा


सिवाय मुझे निम्नलिखित संकेतन var myArray = new Array () का उपयोग करके अपनी सरणी घोषित करनी थी;
टॉम मार्टिन

गैलड यह काम करता है - हाँ अन्यथा यह एक सी # ऑब्जेक्ट के लिए दिखेगा जिसे मायएयर कहा जाता है।
heymega

1
बड़ी मदद। मैंने सोचा था कि मुझे एक मॉडल शब्दकोश से एक जावास्क्रिप्ट ऑब्जेक्ट बनाने के साथ कुछ बड़ी समस्याएं होंगी।
आइब्रीस्ट

धन्यवाद! मैंने इसे निडेड किया, क्योंकि मुझे स्ट्रैसिंग की लिस्ट को जावास्क्रिप्ट में पास करना था और फिर अपने एंगुलर ऐप के लिए टाइपस्क्रिप्ट में :)
ब्लूज़ाइट

@mmcrae, फॉरेस्ट @dलूप के अंदर घोषित किया गया है। ध्यान दें d के सामने VAR शब्द है। यह इसे
फॉरेस्ट

8

JSON सिंटैक्स आपकी ऑब्जेक्ट कोडिंग के लिए जावास्क्रिप्ट सिंटैक्स बहुत सुंदर है । इसलिए, संक्षिप्तता और गति के संदर्भ में, आपका अपना जवाब सबसे अच्छा शर्त है।

मैं इस दृष्टिकोण का उपयोग तब करता हूं जब मेरे नॉकआउटJS मॉडल में ड्रॉपडाउन सूची पॉपिंग होती है । उदाहरण के लिए

var desktopGrpViewModel = {
    availableComputeOfferings: ko.observableArray(@Html.Raw(JsonConvert.SerializeObject(ViewBag.ComputeOfferings))),
    desktopGrpComputeOfferingSelected: ko.observable(),
};
ko.applyBindings(desktopGrpViewModel);

...

<select name="ComputeOffering" class="form-control valid" id="ComputeOffering" data-val="true" 
data-bind="options: availableComputeOffering,
           optionsText: 'Name',
           optionsValue: 'Id',
           value: desktopGrpComputeOfferingSelect,
           optionsCaption: 'Choose...'">
</select>

ध्यान दें कि मैं क्रमांकन के लिए Json.NET NuGet पैकेज और डेटा पास करने के लिए ViewBag का उपयोग कर रहा हूं ।


7

मैं List<Alert>C # से toasts (अलर्ट संदेशों) की एक सूची के साथ काम कर रहा था, और इसे आंशिक दृश्य ( फ़ाइल) में Toastr के लिए जावास्क्रिप्ट सरणी के रूप में आवश्यक था .cshtml। नीचे दिए गए जावास्क्रिप्ट कोड में मेरे लिए काम किया गया है:

var toasts = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(alerts));
toasts.forEach(function (entry) {
    var command = entry.AlertStyle;
    var message = entry.Message;
    if (command === "danger") { command = "error"; }
    toastr[command](message);
});

4

मैं एक स्लाइडर को एकीकृत कर रहा था और फ़ोल्डर में सभी फ़ाइलों को प्राप्त करने की आवश्यकता थी और जावास्क्रिप्ट के लिए एक ही स्थिति सी # सरणी हो रही थी। इस समाधान में @heymega द्वारा पूरी तरह से काम किया गया था सिवाय मेरे जावास्क्रिप्ट पार्सर लूप varमें उपयोग पर नाराज था foreach। इसलिए मैंने पाश से बचने के लिए थोड़ा काम किया।

var allowedExtensions = new string[] { ".jpg", ".jpeg", ".bmp", ".png", ".gif" };

var bannerImages = string.Join(",", Directory.GetFiles(Path.Combine(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, "Images", "banners"), "*.*", SearchOption.TopDirectoryOnly)
    .Where(d => allowedExtensions.Contains(Path.GetExtension(d).ToLower()))
    .Select(d => string.Format("'{0}'", Path.GetFileName(d)))
    .ToArray());

और जावास्क्रिप्ट कोड है

var imagesArray = new Array(@Html.Raw(bannerImages));

आशा करता हूँ की ये काम करेगा


4

संदर्भ के लिए, शीर्ष-वोट किए गए उत्तर पर विस्तार करने के लिए, यदि आप सरणी में अधिक जटिल आइटम जोड़ना चाहते हैं:

@:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");

आदि।

इसके अलावा, यदि आप अपने नियंत्रक के लिए एक पैरामीटर के रूप में सरणी को पास करना चाहते हैं, तो आप इसे पहले से सख्त कर सकते हैं:

myArray = JSON.stringify({ 'myArray': myArray });


आपके कोड के साथ कोई समस्या है। यह होना चाहिए @:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");
असद

1

जैसा कि मैंने लागू किया है यह बेहतर दृष्टिकोण होगा :)

@model ObjectUser
@using System.Web.Script.Serialization
@{ 
    var javaScriptSearilizer = new JavaScriptSerializer();
    var searializedObject = javaScriptSearilizer.Serialize(Model);
 }

<script>
    var searializedObject = @Html.Raw(searializedObject )
    console.log(searializedObject);
    alert(searializedObject);
</script>

आशा है कि यह आपको पुनरावृत्त मॉडल (खुश कोडिंग) से रोकने में मदद करेगा


0

यदि यह एक सममित (आयताकार) सरणी है तो एकल आयाम जावास्क्रिप्ट सरणी में धकेलने का प्रयास करें; सरणी संरचना का निर्धारण करने के लिए रेजर का उपयोग करें; और फिर एक 2 आयामी सरणी में बदलना।

// this just sticks them all in a one dimension array of rows * cols
var myArray = new Array();
@foreach (var d in Model.ResultArray)
{
    @:myArray.push("@d");
}

var MyA = new Array();

var rows = @Model.ResultArray.GetLength(0);
var cols = @Model.ResultArray.GetLength(1);

// now convert the single dimension array to 2 dimensions
var NewRow;
var myArrayPointer = 0;

for (rr = 0; rr < rows; rr++)
{
  NewRow = new Array();
  for ( cc = 0; cc < cols; cc++)
  {
    NewRow.push(myArray[myArrayPointer]);
    myArrayPointer++;
  }
  MyA.push(NewRow);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.