Razor MVC Populando o array de Javascript com o Model Array

Estou tentando carregar um array JavaScript com uma matriz do meu modelo. Parece-me que isso deveria ser possível.

Nenhuma das formas abaixo funciona.

Não é possível criar um loop de JavaScript e incrementar através do Model Array com a variável JavaScript

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

Não é possível criar um loop Razor, JavaScript está fora do escopo

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

Posso fazer com que funcione

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

Mas eu não sei porque eu deveria usar o JSON.

Também enquanto no momento estou restringindo isso para 255 bytes. No futuro, pode ser executado em muitos MBs.

Isso é possível, você só precisa percorrer a coleção de razors

  

Espero que isto ajude

A syntax JSON é basicamente a syntax JavaScript para codificar seu object . Portanto, em termos de concisão e velocidade, sua própria resposta é a melhor aposta.

Eu uso essa abordagem ao preencher listas suspensas no meu modelo KnockoutJS . Por exemplo

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

  

Note que estou usando o pacote Json.NET NuGet para serialização e o ViewBag para passar dados.

Eu estava integrando um slider e precisava obter todos os arquivos na pasta e estava tendo a mesma situação de array C # para o array javascript. Esta solução da @heymega funcionou perfeitamente, exceto o meu analisador javascript estava irritado com o var uso no loop foreach . Então eu fiz um pequeno trabalho em torno de evitar o loop.

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

E o código javascript é

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

Espero que ajude

Eu estava trabalhando com uma lista de torradas (mensagens de alerta), List de C # e precisava dele como uma matriz JavaScript para Toastr em uma visão parcial (arquivo .cshtml ). O código JavaScript abaixo é o que funcionou para mim:

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

Para expandir a resposta mais votada, para referência, se você deseja adicionar itens mais complexos à matriz:

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

etc.

Além disso, se você quiser passar a matriz como um parâmetro para o seu controlador, você pode stringificá-lo primeiro:

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

Se for um array simétrico (retangular), tente inserir em um array javascript de dimensão única; use razor para determinar a estrutura da matriz; e depois transformar em um array bidimensional.

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

Esta seria a melhor abordagem como eu implementei 🙂

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

Espero que isso ajude você a impedir que você faça uma iteração do modelo (codificação feliz)