Razor MVC Заполнение массива Javascript с помощью массива моделей

Я пытаюсь загрузить массив JavaScript с массивом из моей модели. Мне кажется, что это должно быть возможно.

Ни один из нижеперечисленных способов не работает.

Невозможно создать цикл JavaScript и увеличить его с помощью массива моделей с переменной JavaScript

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

Невозможно создать цикл Razor, JavaScript недоступен

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

Я могу заставить его работать с

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

Но я не знаю, зачем мне использовать JSON.

Также пока я ограничиваю это 255 байтами. В будущем он может работать во многих МБ.

Ответ 1

Это возможно, вам просто нужно пройти через коллекцию бритвы

<script type="text/javascript">

    var myArray = [];

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

    alert(myArray);

</script>

Надеюсь, что это поможет

Ответ 2

Синтаксис JSON в значительной степени является синтаксисом JavaScript для кодирования вашего объекта. Поэтому, с точки зрения краткости и скорости, ваш собственный ответ - лучший выбор.

Я использую этот подход, когда заполняет выпадающие списки в моей модели KnockoutJS. Например.

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 для передачи данных.

Ответ 3

Я интегрировал слайдер и нуждался в том, чтобы получить все файлы в папке и имел ту же ситуацию, что и массив С# для массива javascript. Это решение от @heymega отлично работало, за исключением того, что мой парсер javascript был раздражен при использовании 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());

И код javascript

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

Надеюсь, что это поможет

Ответ 4

Чтобы расширить ответ на верхний голос, для справки, если вы хотите добавить более сложные элементы в массив:

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

и др.

Кроме того, если вы хотите передать массив в качестве параметра вашему контроллеру, вы можете сначала его перенести:

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

Ответ 5

Я работал со списком тостов (предупреждающих сообщений), List<Alert> из С# и нуждался в нем в качестве массива JavaScript для Toastr в частичном представлении (.cshtml файл). Ниже приведен код JavaScript ниже:

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