Razor MVC 使用模型数组填充 Javascript 数组

问题描述 投票:0回答:12

我正在尝试使用模型中的数组加载 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 字节。将来它可能会遇到很多 MB。

javascript arrays asp.net-mvc asp.net-mvc-4 razor
12个回答
254
投票

这是可能的,你只需要循环遍历razor集合即可

<script type="text/javascript">

    var myArray = [];

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

    alert(myArray);

</script>

14
投票

我正在处理 Toast 列表(警报消息),来自 C# 的

List<Alert>
,需要将其作为部分视图(.cshtml 文件)中
Toastr
的 JavaScript 数组。下面的 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);
});

8
投票

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 来传递数据。


6
投票
如果您想向数组添加更复杂的项目,请扩展投票最高的答案,以供参考:

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



等等

此外,如果您想将数组作为参数传递给控制器,您可以先将其字符串化:

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


    


4
投票
我正在集成一个滑块,需要获取文件夹中的所有文件,并且具有与 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));

希望有帮助


1
投票
这将是更好的方法,因为我已经实施了:)

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

希望这能帮助您防止迭代模型(快乐编码)


0
投票
如果它是一个对称(矩形)数组那么 尝试推入一维 JavaScript 数组; 使用razor确定数组结构;和 然后转换成二维数组。

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

0
投票
具有命名字段的有效语法:

var array = []; @foreach (var item in model.List) { @:array.push({ "Project": "@item.Project", "ProjectOrgUnit": "@item.ProjectOrgUnit" }); }
    

0
投票
@functions { string GetStringArray() { var stringArray = "["; for (int i = 0; i < Model.List.Count; i++) { if (i != Model.List.Count - 1) { stringArray += $"'{Model.List[i]}', "; } else { stringArray += $"'{Model.List[i]}']"; } } return stringArray; } } <script> var list = @Html.Raw(GetStringArray()); </script>
    

0
投票
也许这个简单的解决方案也很有趣,它也可以轻松应用于 javascript 字典:

<script type="text/javascript"> var myArray = [ @foreach (var d in Model.data) { @:"@d", } ]; </script>
翻译成这样(这里将 string1 到 stringN 视为 Model.data 的内容)

<script type="text/javascript"> var myArray = [ "string1", "string2", "string3", ... "stringN", ]; </script>
    

0
投票
我需要创建一个 JSON 对象数组。以下方法有效。

const data= [ @foreach (var item in Model.Data) { @:{ items: { scores: @item.Score, link: @item.Id, color: '#58C1EE', borderColor: 'black' } }, } ];
    

-1
投票
<script> var tempArray = []; @foreach (var item in Model.Collection) { @:tempArray.push({ Field1: "@item.Field1", Field2: "@item.Field2" }); } $("#btn").on("click", function () { $.ajax({ url: '/controller/action', type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify(tempArray), success: function (resp) { alert(resp); } }); }); </script>
控制器/动作
参数: ICollection 

_items<_Model>

© www.soinside.com 2019 - 2024. All rights reserved.