【问题标题】:How do I convert a C# List<string[]> to a Javascript array?如何将 C# List<string[]> 转换为 Javascript 数组?
【发布时间】:2013-08-30 12:16:28
【问题描述】:

我有一个数据表,我将其转换为列表,对其进行序列化并使用视图模型将其传递给我的视图。

我的视图模型如下所示:

public class AddressModel
{
    public string Addresses { get; set; }
}

我的控制器操作如下所示:

AddressModel lAddressGeocodeModel = new AddressGeocodeModel();
List<string[]> lAddresses = new List<string[]>();

string lSQL = " select Address1, CityName, StateCode, ZipCode " +
                      " from AddressTable  ";

// Convert the data to a List to be serialized into a Javascript array.
//{
...data retrieval code goes here...
//}
foreach (DataRow row in AddressTable.Rows)
{
    string[] lAddress = new string[5];
    lAddress[1] = row["Address1"].ToString();
    lAddress[2] = row["CityName"].ToString();
    lAddress[3] = row["StateCode"].ToString();
    lAddress[4] = row["ZipCode"].ToString();
    lAddresses.Add(lAddress);
}

lAddressGeocodeModel.UnitCount = lAddresses.Count().ToString();
// Here I'm using the Newtonsoft JSON library to serialize my List
lAddressGeocodeModel.Addresses = JsonConvert.SerializeObject(lAddresses);

return View(lAddressModel);

然后在我看来,我得到以下地址字符串:

[["123 Street St.","City","CA","12345"],["456 Street St.","City","UT","12345"],["789 Street St.","City","OR","12345"]]

我应该如何将这个位于剃刀模型中的序列化字符串放入 javascript 数组中?

【问题讨论】:

    标签: c# javascript razor


    【解决方案1】:

    您可以直接将值注入 JavaScript:

    //View.cshtml
    <script type="text/javascript">
        var arrayOfArrays = JSON.parse('@Html.Raw(Model.Addresses)');
    </script>
    

    JSON.parseHtml.Raw

    您也可以通过 Ajax 获取值:

    public ActionResult GetValues()
    {
        // logic
        // Edit you don't need to serialize it just return the object
    
        return Json(new { Addresses: lAddressGeocodeModel });
    }
    
    <script type="text/javascript">
    $(function() {
        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetValues")',
            success: function(result) {
                // do something with result
            }
        });
    });
    </script>
    

    jQuery.ajax

    【讨论】:

    • 我认为您需要将模型编码为Json:@Html.Raw(Json.Encode(Model.Addresses))
    • 当我在控制器上检查字符串时,它是这样的:[[\"123 Street St.\",\"City\",\"CA\",\"12345\"], ...] 这是一个正确的 JSON 字符串。当我在 Chrome 中将字符串打印到控制台时,它看起来像这样:[[“123 Street St.”、“City”、“CA”、“12345”]、...] 当我重新- 使用 Json.Encode 对其进行编码,然后尝试使用 JSON.parse 解析它(像这样 - JSON.parse('@Html.Raw(Json.Encode(Model.Addresses))'); 我在控制台:“未捕获的语法错误:意外的数字”
    • 我想我将尝试一种不同的方法并执行一个正确的 JsonResult 控制器操作,该操作返回一个 Json() C# 对象。我不知道为什么我在使用 Javascript 和 Razor 语法时遇到这么多麻烦,但它就是不工作。
    • 当您可以在 CSHTML 上打印字符串时,您不需要执行 JSON.parse,您只需将 JSON 字符串分配给变量即可。 JSON 无论如何都是一个有效的 JavaScript 对象。
    • 对于那些现在(2019 年)出现的人来说,将 c# 数组注入 javascript 的正确方法就像 var data = @Json.Serialize(Model.Tags) 一样简单,其中标签是 List&lt;string&gt;
    【解决方案2】:

    Json Parse 有很多方法,但我找到了最有效的方法

     @model  List<string[]>
    
         <script>
    
             function DataParse() {
                 var model = '@Html.Raw(Json.Encode(Model))';
                 var data = JSON.parse(model);  
    
                for (i = 0; i < data.length; i++) {
                ......
                 }
             }
         </script>
    

    【讨论】:

    • 我不知道为什么这不是答案
    • 因为它是在最初提出问题三年后发布的。
    • 顺便说一句,for () 后面缺少一个右大括号。
    • 因为这里的模型对象是List,但在问题中它是一个逗号分隔的字符串。但是,我会直接将列表发送到视图,并让视图通过执行 Mehul 发布的内容来处理它,但只需一行。
    【解决方案3】:

    这在 ASP.NET Core MVC 中对我有用。

    <script type="text/javascript">
        var ar = @Html.Raw(Json.Serialize(Model.Addresses));
    </script>
    

    【讨论】:

    • 完美。在 ASP.NET Core 2.0 上使用。
    【解决方案4】:

    其中许多答案确实有效,但我发现迄今为止最简单的方法是通过 ViewData 或 ViewBag 发送数据并让 JSON.Net 对其进行序列化。

    当页面加载之前需要 Javascript 生成 HTML 或需要避免 AJAX 开销时,我会使用此技术:

    在控制器中:

    public ActionResult MyController()
    {
        var addresses = myAddressesGetter();
        ViewData["addresses"] = addresses ;
        return View();
    }
    

    在视图中:

    @section scripts {
    <script type="text/javascript">
        var MyjavascriptAddresses: @Html.Raw(JsonConvert.SerializeObject(ViewData["addresses"])),
    </script>
    }
    

    您始终可以依赖 JSON.NET,而某些浏览器对 JSON 反序列化的支持很差。 与某些方法相比的另一个好处是,您可以使用浏览器的 View --&gt; Source 查看 Javascript,因为它只是在服务器端生成的文本。

    请注意,在大多数情况下,Web API 是一种将 JSON 发送到客户端的更优雅的方式。

    【讨论】:

    • ViewBag 正是我寻找这个的原因。谢谢!
    【解决方案5】:

    我想说这更多是您对数据建模的方式的问题。与其使用字符串数组作为地址,不如这样更简洁、更容易:

    创建一个类来表示您的地址,如下所示:

    public class Address
    {
        public string Address1 { get; set; }
        public string CityName { get; set; }
        public string StateCode { get; set; }
        public string ZipCode { get; set; }
    }
    

    然后在您的视图模型中,您可以像这样填充这些地址:

    public class ViewModel
    {
        public IList<Address> Addresses = new List<Address>();
    
        public void PopulateAddresses()
        {
            foreach(DataRow row in AddressTable.Rows)
            {
                Address address = new Address
                    {
                        Address1 = row["Address1"].ToString(),
                        CityName = row["CityName"].ToString(),
                        StateCode = row["StateCode"].ToString(),
                        ZipCode = row["ZipCode"].ToString()
                    };
                Addresses.Add(address);
            }
    
            lAddressGeocodeModel.Addresses = JsonConvert.SerializeObject(Addresses);
        }
    }
    

    这将为您提供如下所示的 JSON:

    [{"Address1" : "123 Easy Street", "CityName": "New York", "StateCode": "NY", "ZipCode": "12345"}]
    

    【讨论】:

    • 我相信你是对的。唯一的问题是我的原始代码在非 MVC ASP.NET 中运行良好。在我尝试在 MVC 中实现相同的解决方案之前没有问题。我将坚持使用 $.getJSON() 来获取 JsonResult 操作的结果的“新”解决方案。如果这不起作用,我会更仔细地查看您的解决方案。谢谢!
    【解决方案6】:

    对于那些尝试不使用 JSON 的人,以下是我的做法:

    <script>
        var originalLabels = [ '@Html.Raw(string.Join("', '", Model.labels))'];
    </script>
    

    【讨论】:

      【解决方案7】:

      你是如何做到这一点的:

      //View.cshtml
      <script type="text/javascript">
          var arrayOfArrays = JSON.parse('@Html.Raw(Json.Encode(Model.Addresses))');
      </script>
      

      【讨论】:

        【解决方案8】:

        对于一维数组

        控制器:

        using Newtonsoft.Json;
        var listOfIds = _dbContext.Countries.Where(x => x.Id == Country.USA).First().Cities.Where(x => x.IsCoveredByCompany).Select(x => x.Id).ToList();
        string strArrayForJS = JsonConvert.SerializeObject(listOfIds); //  [1,2,6,7,8,18,25,61,129]
        //Now pass it to the view through the model or ViewBag 
        

        查看:

        <script>
            $(function () {
                var myArray = @HTML.Raw(Model.strArrayForJS);
                console.log(myArray); // [1, 2, 6, 7, 8, 18, 25, 61, 129]
                console.log(typeof (myArray)); //object
            });
        </script>
        

        【讨论】:

          【解决方案9】:

          无论如何,JSON 都是有效的 JavaScript 对象,当您打印 JavaScript 本身时,一旦将 JSON 转换为 JSON,您就不需要进一步编码/解码。

          <script type="text/javascript">
              var addresses = @Html.Raw(Model.Addresses);
          </script>
          

          将打印以下内容,并且是有效的 JavaScript 表达式。

          <script type="text/javascript">
              var addresses = [["123 Street St.","City","CA","12345"],["456 Street St.","City","UT","12345"],["789 Street St.","City","OR","12345"]];
          </script>
          

          【讨论】:

            猜你喜欢
            • 2015-11-06
            • 2016-03-25
            • 2017-12-25
            • 1970-01-01
            • 2013-08-26
            • 2019-02-27
            • 2020-01-11
            • 2023-04-04
            相关资源
            最近更新 更多