Razor MVC Javascript dizisini Model Dizisi ile Dolduruyor


102

Modelimden bir dizi ile bir JavaScript dizisi yüklemeye çalışıyorum. Bana öyle geliyor ki bu mümkün olmalı.

Aşağıdaki yöntemlerden hiçbiri işe yaramaz.

JavaScript değişkeniyle Model Dizisi aracılığıyla bir JavaScript döngüsü ve artış oluşturulamaz

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

Razor döngüsü oluşturulamıyor, JavaScript kapsam dışında

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

Onunla çalışmasını sağlayabilirim

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

Ama neden JSON kullanmam gerektiğini bilmiyorum.

Ayrıca şu anda bunu 255 bayt ile sınırlıyorum. Gelecekte birçok MB ile karşılaşabilir.


Yanıtlar:


220

Bu mümkün, sadece jilet koleksiyonunda dolaşmanız gerekiyor

<script type="text/javascript">

    var myArray = [];

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

    alert(myArray);

</script>

Bu yardımcı olur umarım


Dizimi aşağıdaki gösterimi kullanarak bildirmek zorunda kalmam dışında var myArray = new Array ();
Tom Martin

Gald işe yarıyor - Evet, aksi takdirde myArray adlı bir C # nesnesi arayacaktır.
heymega

1
Büyük yardım. Bir model sözlükten bir javascript nesnesi oluştururken büyük sorunlar yaşayacağımı düşündüm.
IAbstract

Teşekkür ederim! Bunu aradım, çünkü Dizeler Listesi'ni Javascript'e ve ardından Angular Uygulamam için
Typescript'e iletmem gerekti

@mmcrae, @dforeach döngüsü içinde bildirilir. D'nin önünde VAR terimi olduğuna dikkat edin. Bu , foreach döngüsünün içinde kullanılmasını sağlar
JhWebDev

8

JSON sözdizimi , hemen hemen nesnenizi kodlamak için JavaScript sözdizimidir . Bu nedenle, özlülük ve hız açısından kendi cevabınız en iyi bahistir.

KnockoutJS modelimde açılır listeleri doldururken bu yaklaşımı kullanıyorum . Örneğin

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>

Ben kullanıyorum o Not Json.NET Nuget paketi veri iletmek için serileştirme ve ViewBag için.


8

List<Alert>C # 'dan bir tost listesi (uyarı mesajları) üzerinde çalışıyordum ve kısmi bir görünümde ( .cshtmldosya) Toastr için JavaScript dizisi olarak ihtiyacım vardı . Aşağıdaki JavaScript kodu benim için çalıştı:

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);
});

5

Diziye daha karmaşık öğeler eklemek istiyorsanız, en çok oylanan yanıtı genişletmek için:

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

vb.

Ayrıca, diziyi denetleyicinize bir parametre olarak iletmek istiyorsanız, önce dizgeyi belirtebilirsiniz:

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


Kodunuzla ilgili bir sorun var. O olmalı @:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");
Asad

4

Bir kaydırıcıyı entegre ediyordum ve klasördeki tüm dosyaları almam gerekiyordu ve C # dizisinin javascript dizisine aynı durumdaydı. @Heymega'nın bu çözümü, javascript ayrıştırıcımın döngüde varkullanımdan rahatsız olması dışında mükemmel çalıştı foreach. Bu yüzden döngüden kaçınmak için biraz çalıştım.

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());

Ve javascript kodu

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

Umarım yardımcı olur


1

Bu, uyguladığım için daha iyi bir yaklaşım olacaktır :)

@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>

Umarım bu, modeli yinelemenizi önlemenize yardımcı olur (mutlu kodlama)


0

Simetrik (dikdörtgen) bir dizi ise, o zaman tek boyutlu bir javascript dizisine itmeyi deneyin; dizi yapısını belirlemek için ustura kullanın; ve sonra 2 boyutlu bir diziye dönüşür.

// 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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.