Razor MVC, заполняющий массив Javascript модельным массивом
Я пытаюсь загрузить массив JavaScript с массивом из моей модели. Мне кажется, что это должно быть возможно.
ни один из приведенных ниже способов не работает.
не удается создать цикл JavaScript и увеличить через массив модели с переменной JavaScript
for(var j=0; j<255; j++)
{
jsArray = (@(Model.data[j])));
}
не удается создать цикл бритвы, JavaScript выходит за рамки
@foreach(var d in Model.data)
{
jsArray = d;
}
Я могу заставить его работать с
var jsdata = @Html.Raw(Json.Encode(Model.data));
но я не знаю, почему я должен использовать JSON.
также в то время как на данный момент я ограничиваю это до 255 байт. В будущем он может столкнуться со многими MBs.
7 ответов:
это возможно, Вам просто нужно пройти через коллекцию бритвы
<script type="text/javascript"> var myArray = []; @foreach (var d in Model.data) { @:myArray.push("@d"); } alert(myArray); </script>надеюсь, что это помогает
синтаксис 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 для передачи данных.
я интегрировал слайдер и должен был получить все файлы в папке и имел такую же ситуацию с массивом C# для массива 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));надеюсь, что это помогает
Я работал со списком тостов (предупреждающих сообщений),
List<Alert>из C# и нужен он как массив JavaScript для Toastr в частичном виде (). Код 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); });
чтобы развернуть ответ с голосованием сверху, Для справки, если вы хотите добавить более сложные элементы в массив:
@:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");etc.
кроме того, если вы хотите передать массив в качестве параметра контроллеру, вы можете сначала его stringify:
myArray = JSON.stringify({ 'myArray': myArray });
если это симметричный (прямоугольный) массив, то Попробуйте нажать в одном измерении javascript массив; используйте razor для определения структуры массива; и затем преобразовать в 2-мерный массив.
// 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); }
Это было бы лучше подход, как я реализовал :)
@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>надеюсь, что это поможет вам предотвратить повторение модели (счастливое кодирование)
Comments