Razor MVC Đưa mảng Javascript vào Mảng Mô hình


100

Tôi đang cố gắng tải một mảng JavaScript với một mảng từ mô hình của tôi. Đối với tôi dường như điều này là có thể.

Cả hai cách dưới đây đều không hoạt động.

Không thể tạo vòng lặp JavaScript và tăng dần thông qua Mảng mô hình với biến JavaScript

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

Không thể tạo vòng lặp Razor, JavaScript nằm ngoài phạm vi

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

Tôi có thể làm cho nó hoạt động với

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

Nhưng tôi không biết tại sao tôi phải sử dụng JSON.

Ngoài ra, hiện tại tôi đang giới hạn điều này ở 255 byte. Trong tương lai, nó có thể chạy thành nhiều MB.


1
bạn có thể sử dụng dao cạo trong js nhưng không thể ngược lại
Ehsan Sajjad

Câu trả lời:


215

Điều này là có thể, bạn chỉ cần lặp lại bộ sưu tập dao cạo

<script type="text/javascript">

    var myArray = [];

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

    alert(myArray);

</script>

Hi vọng điêu nay co ich


Ngoại trừ việc tôi phải khai báo mảng của mình bằng cách sử dụng ký hiệu sau var myArray = new Array ();
Tom Martin

Gald nó hoạt động - Có nếu không, nó sẽ tìm kiếm một đối tượng C # được gọi là myArray.
heymega

1
Giúp đỡ lớn. Tôi nghĩ rằng tôi sẽ gặp một số vấn đề lớn với việc xây dựng một đối tượng javascript từ một từ điển mô hình.
IAbstract

Cảm ơn bạn! Tôi neeeded này, bởi vì tôi đã phải vượt qua một danh sách của Strings để javascript và sau đó đến nguyên cảo cho góc App của tôi :)
Bluesight

@mmcrae, @dđược khai báo bên trong vòng lặp foreach. Lưu ý rằng d có thuật ngữ VAR ở phía trước. Cho phép nó được sử dụng bên trong vòng lặp foreach
JhWebDev

8

Cú pháp JSON là khá nhiều cú pháp JavaScript để mã hóa đối tượng của bạn . Vì vậy, về tính ngắn gọn và tốc độ, câu trả lời của riêng bạn là tốt nhất.

Tôi sử dụng phương pháp này khi điền danh sách thả xuống trong mô hình KnockoutJS của mình . Ví dụ

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>

Lưu ý rằng tôi đang sử dụng gói Json.NET NuGet để tuần tự hóa và ViewBag để truyền dữ liệu.


7

Tôi đang làm việc với một danh sách các bánh mì nướng (thông báo cảnh báo), List<Alert>từ C # và cần nó làm mảng JavaScript cho Toastr ở dạng xem một phần ( .cshtmltệp). Mã JavaScript bên dưới là những gì phù hợp với tôi:

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

Tôi đang tích hợp một thanh trượt và cần lấy tất cả các tệp trong thư mục và có cùng một mảng C # trang web thành mảng javascript. Giải pháp này của @heymega hoạt động hoàn hảo ngoại trừ trình phân tích cú pháp javascript của tôi bị khó chịu khi varsử dụng trong foreachvòng lặp. Vì vậy, tôi đã làm một việc nhỏ xung quanh việc tránh vòng lặp.

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

Và mã javascript là

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

Hy vọng nó giúp


4

Để mở rộng câu trả lời được bình chọn nhiều nhất, để tham khảo, nếu bạn muốn thêm các mục phức tạp hơn vào mảng:

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

Vân vân.

Hơn nữa, nếu bạn muốn truyền mảng dưới dạng một tham số cho bộ điều khiển của mình, bạn có thể xâu chuỗi nó trước:

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


Có vấn đề với mã của bạn. Nó phải là @:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");
Asad

1

Đây sẽ là cách tiếp cận tốt hơn như tôi đã triển khai :)

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

Hy vọng điều này sẽ giúp bạn ngăn bạn lặp lại mô hình (viết mã vui vẻ)


0

Nếu đó là một mảng đối xứng (hình chữ nhật) thì Hãy thử đẩy vào một mảng javascript một chiều; sử dụng dao cạo để xác định cấu trúc mảng; và sau đó biến đổi thành một mảng 2 chiều.

// 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.