Razor MVC用Model array填充Javascript数组

Razor MVC Populating Javascript array with Model Array

本文关键字:填充 Javascript 数组 array Model MVC Razor      更新时间:2023-09-26

我正试图用我的模型中的数组加载一个JavaScript数组。在我看来,这应该是可能的。

以下两种方法都不起作用。

无法通过带有JavaScript变量的Model Array创建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。

这是可能的,您只需要循环遍历剃刀集合

<script type="text/javascript">
    var myArray = [];
    @foreach (var d in Model.data)
    {
        @:myArray.push("@d");
    }
    alert(myArray);
</script>

我正在处理一个toast(警报消息(列表,来自C#的List<Alert>,需要它作为Toast的部分视图中的JavaScript数组(.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);
});

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

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

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

等等。

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

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

我正在集成一个滑块,需要获取文件夹中的所有文件,并且从C#数组到javascript数组的位置相同。@heymega的这个解决方案运行得很好,只是我的javascript解析器对varforeach循环中的使用感到恼火。所以我做了一些避免循环的工作。

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

希望它能帮助

这将是我实现的更好的方法:(

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

希望这将帮助您避免迭代模型(愉快编码(

如果它是对称(矩形(数组,则尝试推入一维javascript数组;用剃刀确定阵列结构;和然后变换为二维阵列。

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

带有命名字段的有效语法:

  var array = [];
     @foreach (var item in model.List)
     {
        @:array.push({ 
                       "Project": "@item.Project",
                       "ProjectOrgUnit": "@item.ProjectOrgUnit"
                     });
     }
@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>

也许这个简单的解决方案也很有趣,它可以很容易地应用于javascript字典:

<script type="text/javascript">
    var myArray = [
    @foreach (var d in Model.data)
    {
        @:"@d",
    }
    ];
</script>

翻译成这个(字符串1到字符串N在这里被认为是Model.data的内容(

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

我需要创建一个JSON对象数组。以下方法奏效了。

const data=
        [
            @foreach (var item in Model.Data)
            {
                @:{ items: { scores: @item.Score, link: @item.Id, color: '#58C1EE', borderColor: 'black' } },
            }
        ];
<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&lt_型号&gt_项目