【问题标题】:Razor MVC Populating Javascript array with Model ArrayRazor MVC 使用模型数组填充 Javascript 数组
【发布时间】:2021-01-13 12:56:24
【问题描述】:

我正在尝试从我的模型中加载一个带有数组的 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。

【问题讨论】:

  • js中可以访问razor,反之不行

标签: javascript arrays asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

这是可能的,你只需要遍历剃刀集合

<script type="text/javascript">

    var myArray = [];

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

    alert(myArray);

</script>

希望对你有帮助

【讨论】:

  • 除非我必须使用以下符号声明我的数组 var myArray= new Array();
  • Gald 它可以工作 - 是的,否则它将寻找一个名为 myArray 的 C# 对象。
  • 帮助很大。我认为从模型字典构建 javascript 对象会遇到一些大问题。
  • 谢谢!我需要这个,因为我必须将一个字符串列表传递给 Javascript,然后传递给我的 Angular 应用程序的 Typescript :)
  • 请注意,如果您的数组中的项目包含引号或反斜杠,这将呈现无效的 javascript。解决这个问题的一种方法是使用:@:myArray.push("@Html.Raw(HttpUtility.JavaScriptStringEncode(d))");
【解决方案2】:

我正在处理来自 C# 的 toasts(警报消息)列表 List&lt;Alert&gt;,并且需要它作为部分视图中 Toastr 的 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);
});

【讨论】:

    【解决方案3】:

    JSON 语法is pretty much the JavaScript syntax for coding your object。因此,就简洁性和速度而言,您自己的答案是最好的选择。

    我在populating dropdown lists in my KnockoutJS model 时使用这种方法。例如。

    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 package 进行序列化,并使用 ViewBag 传递数据。

    【讨论】:

      【解决方案4】:

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

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

      等等

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

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

      【讨论】:

      • 您的代码有问题。应该是@:myArray.push(ClassMember1: "@d.ClassMember1", ClassMember2: "@d.ClassMember2");
      【解决方案5】:

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

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

      希望对你有帮助

      【讨论】:

        【解决方案6】:

        这将是我实施的更好的方法:)

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

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

        【讨论】:

          【解决方案7】:

          如果是对称(矩形)数组,那么 尝试推入一维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);
          }
          

          【讨论】:

            【解决方案8】:

            命名字段的有效语法:

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

            【讨论】:

              【解决方案9】:
              @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>
              

              【讨论】:

                【解决方案10】:
                <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 <_model> _items

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-11-10
                  • 2018-09-26
                  • 1970-01-01
                  • 2023-03-06
                  相关资源
                  最近更新 更多