如何将 C# List<string[]> 转换为 Javascript 数组?

IT技术 c# javascript razor
2021-01-19 19:37:08

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

我的视图模型如下所示:

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 数组中?

6个回答

您可以直接将值注入 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))
2021-03-23 19:37:08
当我检查控制器上的字符串时,它是这样的: [[\"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))'); 我在控制台:“未捕获的语法错误:意外的数字”
2021-03-27 19:37:08
当你可以在 CSHTML 上打印字符串时,你不需要做 JSON.parse,你可以简单地将 JSON 字符串分配给变量。无论如何,JSON 是一个有效的 JavaScript 对象。
2021-03-28 19:37:08
对于那些现在出现的人(2019 年),将 ac# 数组注入 javascript 的正确方法就像var data = @Json.Serialize(Model.Tags)标签是一个List<string>
2021-03-31 19:37:08
我想我将尝试不同的方法并执行一个适当的 JsonResult 控制器操作,该操作返回一个 Json() C# 对象。我不知道为什么我在使用 Javascript 和 Razor 语法时遇到这么多麻烦,但它不起作用。
2021-04-14 19:37:08

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>
因为这里的模型对象是一个List但在问题中它是一个逗号分隔的字符串。但是,我会直接将列表发送到视图,让视图通过执行 Mehul 发布的操作来处理该列表,但只是在一行中。
2021-03-22 19:37:08
顺便说一下,在 for () 之后缺少一个右大括号。
2021-03-23 19:37:08
因为它是在最初提出问题的三年后发布的。
2021-03-27 19:37:08
我不知道为什么这不是答案
2021-04-05 19:37:08

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

<script type="text/javascript">
    var ar = @Html.Raw(Json.Serialize(Model.Addresses));
</script>
完美的。在 ASP.NET Core 2.0 上使用。
2021-04-02 19:37:08

其中许多答案确实有效,但我发现迄今为止最简单的方法是通过 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 反序列化支持很差。与某些方法相比的另一个好处是,您可以使用浏览器的 来查看 Javascript View --> Source,因为它只是在服务器端生成的文本。

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

ViewBag 正是我寻找这个的原因。谢谢!
2021-03-20 19:37:08

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

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

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 操作的结果的“新”解决方案。如果这不起作用,我将更仔细地研究您的解决方案。谢谢!
2021-03-17 19:37:08