Я пытаюсь загрузить массив 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);
});